Ich habe mehrere CSV-Dateien, die bereinigt werden müssen.Die betreffenden Dateien haben zwei grundlegende Datenblockstrukturen.Der erste Block besteht aus 1 Spalte mit 7 Informationszeilen.Das zweite Segment enthält 6 Spalten mit mehr als 5 Datenzeilen.
Für den ersten Block besteht die ideale Transformation darin, die Spalte in zwei Teile zu teilen.Ein Teil liefert die Überschrift oder den Namen der Spalte. Und der zweite Teil liefert Dateninformationen zu diesem spezifischen Experiment.
Der zweite Block erfordert minimale Eingriffe.
Bisher ist es mir bis auf ein paar störende Punkte gelungen, mich dem gewünschten Zustand anzunähern.Erstens ist das Aufteilen der CSV-Datei in zwei Teile – zwei Tabellen – kein Problem.Die erste Datentabelle –dt1- ist die ursprüngliche CSV-Datei, aus der Daten extrahiert und einige Zeilen gelöscht werden, um eine zweite Datentabelle –dt2 zu erstellen.Die zweite Datentabelle enthält die 1. Spalte mit 7 Zeilen; die einer weiteren Behandlung bedürfen.
Dazu beginne ich mit einer neuen Datentabelle -dt3.Es ist mir gelungen, die Spaltenüberschriften mit einer For-Schleife zu erstellen und das erste Element einer Liste zu übernehmen.Diese Informationen stammen von dt2.Der nächste Teil ist derjenige, der mir ein Problem bereitet.Ich muss das zweite Element der Liste an die erste Zeile von dt3 übergeben oder senden.
Erste Frage:
Warum kann die folgende Zeile die erste Zelle von Spalte 1 in der ursprünglichen Datentabelle (dt1) ändern, der nächste Codeabschnitt funktioniert jedoch nicht in der neuen Datentabelle?
dt1[1,1]=300; //das funktioniert
dt3[1,1]=300; //Das funktioniert nicht.Es wird ein Fehler erzeugt.
Ungültiger Index (muss eine Zahl oder eine Zahlenliste sein) beim Zugriff oder bei der Auswertung von „Assign“, dt3[1, 1] = /*###*/300 /*###*/
Zweite Frage
Ich verwende: als Zeichenkennung, um die ersten sieben Zeilen in Kopfinformationen und Zeilendaten zu unterteilen.Der Nachteil dieses Ansatzes besteht darin, dass die Datums-/Uhrzeitzeile drei dieser Zeichen enthält und die Daten nach dem zweiten gefundenen Zeichen verloren gehen:.Wie kann ich das verhindern?
Irgendwelche Ideen oder Vorschläge? Die beigefügte Excel-Datei ist ein Beispiel für eine Datentabelle.
Vielen Dank für jede Hilfe
Beispiel einer ursprünglichen CSV-Datei
Essensrezept: 1-dicke Soße | | | |
Mixerrezept: 3 Geschwindigkeiten | | | |
Temperaturrezept: 100 Dampf | | | |
Kochzubehör: Edelstahl | | | |
Chargen-ID: Mini-Cake-100 | | | |
Proben-ID: Mini-Cake-100.1 | | |
Datum/Uhrzeit: 30.06.2017 16:12:44 Uhr | | |
| | | | | |
| | | | | |
Punkt | Dichte | Zucker | Verhältnis | X | Y |
1 | 5020.607 | 98.6872 | 0,9976 | 145 | 0 |
2 | 4976.009 | 98.1275 | 0,9955 | 108,75 | 0 |
3 | 4977.177 | 98.3677 | 0,9958 | 72,5 | 0 |
4 | 4982.821 | 98.2569 | 0,9957 | 36.25 | 0 |
5 | 4989.282 | 98.2105 | 0,9977 | 0 | 0 |
Beispiel für Datentabelle 2 (dt2). 1 Spalte mit 7 Zeilen. Das : trennt den Spaltennamen von den experimentellen Informationen.
Essensrezept: 1-dicke Soße |
Mixerrezept: 3 Geschwindigkeiten |
Temperaturrezept: 100 Dampf |
Kochzubehör: Edelstahl |
Chargen-ID: Mini-Cake-100 |
Proben-ID: Mini-Cake-100.1 |
Datum/Uhrzeit: 30.06.2017 16:12:44 Uhr |
Gewünschte Transformation von dt2.
Lebensmittelrezept | Mixer-Rezept | Temperaturrezept | Kochzubehör | Batch-ID | Proben-ID | Terminzeit |
1-dicke Soße | 3-Gang | 100 Dampf | Rostfrei | Mini-Kuchen-100 | Mini-Kuchen-100.1 | ######### |
JSL-Code
<BR />
Names Default To Here( 1 );
Close All(data tables);
Clear Log();
Clear Symbols();
Close All(Journals, No Save);
//***********************************************************************************************************************************************************
/*Open collected data from a share drive
and assign working data table(s) -->dt1
*/
dt1 = Open(
"C:\Users\...................filename.csv",
columns(
Column( "c000001", Character, "Nominal" ),
Column( "c000002", Character, "Nominal" ),
Column( "c000003", Character, "Nominal" ),
Column( "c000004", Character, "Nominal" ),
Column( "c000005", Character, "Nominal" ),
Column( "c000006", Character, "Nominal" )
),
Import Settings(
End Of Line( CRLF, CR, LF ),
End Of Field( Comma, 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( 0 ),
Column Names Start( 1 ),
Data Starts( 1 ),
Lines To Read( "All" ),
Year Rule( "20xx" )
)
);
//The raw data table repeats information every 48 rows
//This table separates each item into individual tables
//The generated table does not have formated column headings
//For(i=1, i <=x, i++, //this For loop is ignored for now until dt2 --> dt problem is solved
selrows =dt1 <<SELECT rows=""></SELECT>
Ihr erstes Problem besteht darin, dass Ihre dt3-Datentabelle keine Zeilen enthält. Wenn Sie hinzufügen
dt3 << add rows(N Rows( dt2 ));
Direkt nach der Erstellung von dt3 können Sie diese Tabelle füllen.
Das zweite Problem besteht darin, dass Sie nicht das zweite Wort der Zeichenfolge benötigen, sondern alles, was auf das erste „:“ folgt. Daher funktioniert die Verwendung der Substr()-Funktion besser:
dt3[iii, 1] = Trim Whitespace( substr(Column( dt2, 1 )[iii], contains(column( dt2, 1 ), ":") ) )