Re: Importe varios archivos CSV, pero JSL debe modificar algún error de formato de títuloSi es posible proporcionar un ejemplo (o algunos si hay diferentes tipos) de archivo .csv, esto sería más fácil. Si no es así, ¿podría proporcionar una tabla de datos "rota"?
Re: Importe varios archivos CSV, pero JSL debe modificar algún error de formato de títuloAdjunto una tabla de muestra para su referencia.
Importe varios archivos CSV, pero JSL debe modificar algunos errores de formato de títuloEstoy intentando importar varios archivos CSV, la función "importar varios archivos" no funciona bien porque el formato del nombre de la columna de datos original tiene dos problemas que harán que el título y los datos no coincidan.
1. El nombre de la columna de datos se ve así: Fecha hora nombre ( ABC ) (DEF ) altura peso ......etc.
2. Los dilim que necesito son espacio y (y)
3. Sin embargo, hay un espacio o tabulación adicional antes de "Fecha", por lo que el nombre de la primera columna se convierte en Columna 1 en lugar de Fecha, y el título se desplaza a la derecha una columna en comparación con los datos.
4. El segundo error es (D, no hay espacio entre estos dos para el título, por lo que se tratan como un solo título, pero los datos se separan en ( y D dos columnas porque hay espacio entre ellas, por lo que el título se desplazará a la izquierda). una columna se compara con los datos
5. El primer error siempre existe antes del nombre de la primera columna "Fecha", pero el segundo error "(D" puede aparecer en un orden diferente según la herramienta fuente
Me gustaría escribir un JSL para que pueda coincidir automáticamente con todos los títulos y columnas, pero no estoy seguro de cómo hacerlo:
Supongo que el primer paso es usar Obtener nombres de columnas() y luego analizar los nombres, pero parece que parse() y word() no funcionan.
Estoy atrapado aquí, realmente no sé cómo codificar, gracias por tu ayuda de antemano.

Automatización y secuencias de comandosRe: Importe varios archivos CSV, pero JSL debe modificar algún error de formato de títuloSegún el ejemplo de dos líneas, lo más probable es que limpie el archivo .csv (elimine () y contraiga los espacios en blanco) y luego use Open with Char to Blob() para convertir esa cadena "fija" en una tabla de datos.
Names Default To Here(1);
str = Load Text File("$DOWNLOADS/sample CSV.csv");
lines = Words(str, "\!N");
data = Transform Each({line}, lines,
str = Collapse Whitespace(Substitute(line, {"(", ")"}, ""))
);
str = Concat Items(data, "\!N");
dt = Open(Char To Blob(str),
Import Settings(
End Of Line(CRLF, CR, LF),
End Of Field(Spaces, Space, CSV(0)),
Strip Quotes(1),
Use Apostrophe as Quotation Mark(0),
Use Regional Settings(0),
Scan Whole File(1),
Treat empty columns as numeric(0),
CompressNumericColumns(0),
CompressCharacterColumns(0),
CompressAllowListCheck(0),
Labels(1),
Column Names Start(1),
First Named Column(1),
Data Starts(2),
Lines To Read("All"),
Year Rule("20xx")
)
);Re: Importe varios archivos CSV, pero JSL debe modificar algún error de formato de título@jthi
¡Tu solución es increíble!
Una pregunta.Su línea donde está eliminando los paréntesis de cada línea, usted especifica
str = Collapse Whitespace(Substitute(line, {"(", ")"}, ""))
donde sustituye todo "(" por ")" y luego sustituye todo ")" por "".
Mi enfoque de la vieja escuela sería:
str = Collapse Whitespace(Substitute(line, "(", "", ")", ""))
donde "(" se sustituye por "" y luego ")" se sustituye por "".
¿Existe alguna ventaja en su sintaxis o es simplemente una elección personal?
Re: Importe varios archivos CSV, pero JSL debe modificar algún error de formato de títuloEs sólo mi elección personal. Generalmente, cuando quiero reemplazar varias cosas con lo mismo, proporciono Sustituto una lista de los valores a reemplazar y luego el valor una vez. Si quiero reemplazarlos con cosas diferentes, uso el enfoque que mostraste O si tengo que construirlo dinámicamente/tengo un archivo de configuración, usaré dos listas
Names Default To Here(1);
str = "AA BB CC DD";
a = Substitute(str, {"AA", "BB"}, "11"); // a = "11 11 CC DD";
b = Substitute(str, "AA", "11", "BB", "22"); // b = "11 22 CC DD";
subs = ["AA" => "33", "BB" => "44"];
c = Substitute(str, subs << get keys, subs << Get Values); // c = "33 44 CC DD";
show(a, b, c);Re: Importe varios archivos CSV, pero JSL debe modificar algún error de formato de títuloGracias por su apoyo, este método funciona bien para un solo archivo.
Pero todavía me queda una pregunta: tengo muchos archivos con el mismo formato que deben importarse como un archivo JMP.
Entonces parece que este método requiere que los abra uno por uno y luego los cocatene en un solo archivo.
Por eso mi pensamiento original fue:
1. utilizar la función de importación múltiple
2. obtener nombres de columnas
3. luego use la función de recodificar nombre de columna para modificar el nombre de cada columna
Re: Importe varios archivos CSV, pero JSL debe modificar algún error de formato de título¿Hay alguna razón específica por la que no pudiste hacer lo siguiente?
- Obtenga una lista de archivos que le interesan
- Utilice For Each para recorrerlos
- Dentro del bucle, analiza los archivos y concatenalos en una tabla que abres primero.
También podría intentar arreglar las columnas, pero según su ejemplo, fue mucho más fácil arreglar el archivo csv que comenzar a alterar los nombres de las columnas y/o cambiar los valores después de importar los valores.
Re: Importe varios archivos CSV, pero JSL debe modificar algún error de formato de títuloArreglar el programa que genera el archivo también podría ser una buena opción. Ese no es un CSV estándar y no creo que ningún otro programa lo analice correctamente tampoco.
Re: Importe varios archivos CSV, pero JSL debe modificar algún error de formato de títuloConcatenar tablas de datos muestra una manera de hacerlo
Re: Importe varios archivos CSV, pero JSL debe modificar algún error de formato de títuloIntenté usar el bucle for para recorrer los archivos, pero no funciona, parece que algo salió mal cuando intenté concatenarlos.
Names Default To Here(1);
dir = Pick Directory("Select a directory");
filelist = Files In Directory(dir);
strings = {};
For(i = 1, i <= N Items(filelist), i++,
file = dir || Eval(Parse(filelist[i]));
str = Load Text File(file);
lines = Words(str, "\!N");
data = Transform Each({line}, lines,
str = Collapse Whitespace(Substitute(line, {"(", ")"}, ""))
);
str = Concat Items(data, "\!N");
strings = strings || str;
);
dt = Open(
Char To Blob(str),
Import Settings(
End Of Line(CRLF, CR, LF),
End Of Field(Spaces, Space, CSV(0)),
Strip Quotes(1),
Use Apostrophe as Quotation Mark(0),
Use Regional Settings(0),
Scan Whole File(1),
Treat empty columns as numeric(0),
CompressNumericColumns(0),
CompressCharacterColumns(0),
CompressAllowListCheck(0),
Labels(1),
Column Names Start(2),
First Named Column(1),
Data Starts(3),
Lines To Read("All"),
Year Rule("20xx")
)
);
Re: Importe varios archivos CSV, pero JSL debe modificar algún error de formato de títuloDespués de varias pruebas, el siguiente código importa con éxito varios archivos CSV a través del bucle y el formato es correcto.
Pero todavía me quedan dos problemas:
1. a partir del segundo archivo, los encabezados no se excluyen como título de columna, se tratan como datos en la tabla, hay dos filas de encabezados, la primera fila es el nombre del archivo, la segunda fila son títulos separados por espacios
2. Me gustaría agregar una columna de nombre de archivo para poder analizar diferentes archivos, pero esto no es como la función de importar varios archivos que puedo lograr fácilmente.
Nombres predeterminados aquí (1);
dir = Seleccionar directorio ("Seleccione un directorio");
lista de archivos = Archivos en el directorio (dir);
mi lista = {};
Para (i = 1, i <= N elementos (lista de archivos), i++,
archivo = directorio || "/" || lista de archivos[i];
str = Cargar archivo de texto (archivo);
líneas = Palabras(cadena, "\!N");
datos = Transformar cada ({línea}, líneas,
línea = Contraer espacios en blanco (Sustituir (línea, {"(", ")"}, ""))
);
cadena modificada = Elementos Concat(datos, "\!N");
milista[i] = cadena modificada;
);
dt = Abierto(
Char To Blob( Elementos Concat( mylist, "\!N" ) ),
Importar ajustes(
Fin de línea (CRLF, CR, LF),
Fin del campo (espacios, espacio, CSV (0)),
Cotizaciones de tira( 1 ),
Utilice el apóstrofe como comillas (0),
Usar configuración regional (0),
Trate las columnas vacías como numéricas (0),
Comprimir columnas numéricas (0),
Comprimir columnas de caracteres (0),
Comprimir la verificación de la lista de permitidos (0),
Etiquetas( 1 ),
Nombres de columna Inicio( 2 ),
Primera columna nombrada (1),
Inicios de datos (3),
Líneas para leer ("Todas"),
Regla del año ("20xx")
)
);
Re: Importe varios archivos CSV, pero JSL debe modificar algún error de formato de títuloNo cree una cadena masiva, sino más bien cree tablas de datos una por una y concatenelas a medida que avanza. Además, cuando publique scripts JSL, utilice "Insertar script JSL".
ya que hace que sea mucho más fácil de leer.
</CODE></PRE>
<P><SPAN class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="jthi_2-1703167262034.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_2-1703167262034.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_2-1703167262034.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_2-1703167262034.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_2-1703167262034.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_2-1703167262034.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_2-1703167262034.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_2-1703167262034.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_2-1703167262034.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_2-1703167262034.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_2-1703167262034.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_2-1703167262034.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_2-1703167262034.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_2-1703167262034.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_2-1703167262034.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_2-1703167262034.png" style="width: 400px;"><SPAN class="lia-inline-image-display-wrapper" image-alt="jthi_2-1703167262034.png" style="width: 400px;"><span class="lia-inline-image-display-wrapper" image-alt="jthi_2-1703167262034.png" style="width: 400px;"><img src="https://us.v-cdn.net/6038925/uploads/images/60013iEF81464ED8426C0C/jthi_2-1703167262034.png" role="button" title="jthi_2-1703167262034.png" alt="jthi_2-1703167262034.png" /></span></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></P>
<P> </P></LINGO-BODY><LINGO-SUB id="lingo-sub-711549" slang="en-US" mode="NONE">Re: Importe varios archivos CSV, pero JSL debe modificar algún error de formato de título</LINGO-SUB><LINGO-BODY id="lingo-body-711549" slang="en-US" mode="NONE"><P><A href="https://community.jmp.com/t5/user/viewprofilepage/user-id/14366" target="_blank">@jthi</A> es correcto, pero si desea seguir concatenando las cadenas, necesitará algunos cambios.<STRONG>Esto fallará si la concatenación tiene >2 GB de caracteres porque esa es la cadena más larga que JMP puede manejar.</STRONG></P>
<P>idea:</P>
<PRE><CODE class=" language-jsl">
For( i = 1, i <= N Items( filelist ), i++,
file = dir || "/" || filelist[i];
str = Load Text File( file );
lines = Words(str, "\!N");
header1 = RemoveFrom(lines, 1); // remove the first line, two times.
header2 = RemoveFrom(lines, 1); // (removes both header lines.)
data = Transform Each({line}, lines,
// prepend the file name to each data line
filelist[i] || " " || Collapse Whitespace(Substitute(line, {"(", ")"}, ""));
);
modifiedstr = Concat Items(data, "\!N");
mylist[i] = modifiedstr;
);
header2 = "filename" || header2; // add the column name "filename"
insertInto(mylist,header2,1); // check the order of the arguments, the goal
insertInto(mylist,header1,1); // is to push these onto the front of the list
// now do the import...Names Default To Here(1);
dir = "$DOWNLOADS/New Folder (7)";
filelist = Files In Directory(dir);
mylist = {};
dt_collector = Empty();
For(i = 1, i <= N Items(filelist), i++,
file = dir || "/" || filelist[i];
str = Load Text File(file);
lines = Words(str, "\!N");
data = Transform Each({line}, lines,
line = Collapse Whitespace(Substitute(line, {"(", ")"}, ""))
);
modifiedstr = Concat Items(data, "\!N");
dt = Open(
Char To Blob(modifiedstr),
Import Settings(
End Of Line(CRLF, CR, LF),
End Of Field(Spaces, Space, CSV(0)),
Strip Quotes(1),
Use Apostrophe as Quotation Mark(0),
Use Regional Settings(0),
Treat empty columns as numeric(0),
Compress Numeric Columns(0),
Compress Character Columns(0),
Compress Allow List Check(0),
Labels(1),
Column Names Start(1),
First Named Column(1),
Data Starts(2),
Lines To Read("All"),
Year Rule("20xx")
),
invisible
);
dt << Set Name(filelist[i]);
dt << New Column("Source", Character, Nominal, << Set Each Value((dt << get name)));
If(!Is Empty(dt_collector),
dt_collector << Concatenate(
dt,
Append to first table
);
Close(dt, no save);
,
dt_collector = dt;
);
);
No probado, pero correcto. busque InsertInto() y RemoveFrom(); No tengo JMP abierto en este momento. La idea es eliminar (y capturar) las dos primeras líneas, cada vez, y después de que todo esté capturado y apilado, coloque las dos primeras líneas al frente, con el nombre de la columna adicional añadido. Y dentro, agregue el nombre del archivo para cada línea.
Re: Importe varios archivos CSV, pero JSL debe modificar algún error de formato de títuloGracias por su apoyo, realmente aprendí mucho en este proyecto jsl.