Spalten Daten teilen und Spaltenüberschriften umbenennenHallo,
Ich habe Data_original.csv, die viele Spalten von haben | oder _ oder keine. In diesem Beispiel werden nur 3 Spalten von | angezeigt.
Ich habe versucht, in der Datenvorschau zu sehen, ob ich mich teilen kann, aber meine Spalte ist durcheinander.
Data_original.csv<BR /><BR />Fruit,ID,Colors,Weigth,CountryCode<BR />Apple,123456,5_2|1_4,3|3|3|oz,1_2_5|3_2_1_123_2343_342|1_2<BR />Apricot,5555666,9_0|55_298,5|3|2|1|lb,0_9_1|23<BR />Grape,98746,12_1|23_99,1|2|1|7|6|4|2|1|8|g,9_1_3|23_45_4<BR />Orange,25897,8_8|0_9,2|3|fl,1_0_4|99_999_888|0_8<BR />Pear,113355,9999_77|78_123,4|6|l,-9999_76_123|9<BR />Plum,8855446,32_-8888|00_12,5|9|lb,123_1_55|123_90<BR />Strawberries,981254,981_123|34_123,8|3|g,89_12_45|67_1_23_8|90<BR /><BR /><BR />Open(
"C:\JSL\Data_original.csv",
Import Settings(
End Of Line( CRLF, CR, LF ),
End Of Field( Comma, Other( "|" ), CSV( 0 ) ),
Strip Quotes( 1 ),
Use Apostrophe as Quotation Mark( 0 ),
Scan Whole File( 1 ),
Treat empty columns as numeric( 0 ),
CompressNumericColumns( 0 ),
CompressCharacterColumns( 0 ),
CompressAllowListCheck( 0 ),
Labels( 1 ),
Column Names Start( 1 ),
Data Starts( 2 ),
Lines To Read( "All" ),
Year Rule( "20xx" )
)
);
Zuerst möchte ich Data_original.csv öffnen. Löschen Sie alle Spalten von | split (falls vorhanden und nur den ersten Wert split behalten). Ich dachte, nach dem Teilen sollte ich in der Lage sein, jeden Spaltenkopfnamen mit Spalte * zu löschen und in csv zu speichern.
Siehe die Ausgabe von Data_original_EDIT1.csv.
Fruit,ID,Colors,Weigth,CountryCode<BR />Apple,123456,5_2,3,1_2_5<BR />Apricot,5555666,9_0,5,0_9_1<BR />Grape,98746,12_1,1,9_1_3<BR />Orange,25897,8_8,2,1_0_4<BR />Pear,113355,9999_77,4,-9999_76_123<BR />Plum,8855446,32_-8888,5,123_1_55<BR />Strawberries,981254,981_123,8,89_12_45
Zweitens möchte ich die vorherige Sicherungs-CSV, Data_original_EDIT1.csv, öffnen.Geteilt durch _ Spalte (falls vorhanden) und benennen Sie die Spaltenüberschrift in dieselbe Spaltenüberschrift um, verketten Sie jedoch eine Sequenz 0..n.
Siehe Data_original_EDIT2_Final.csv, den endgültigen Ausgabeexport nach csv.
Fruit,ID,Colors0,Colors1,Weigth,CountryCode0,CountryCode1,CountryCode2
Apple,123456,5,2,3,1,2,5
Apricot,5555666,9,0,5,0,9,1
Grape,98746,12,1,1,9,1,3
Orange,25897,8,8,2,1,0,4
Pear,113355,9999,77,4,-9999,76,123
Plum,8855446,32,-8888,5,123,1,55
Strawberries,981254,981,123,8,89,12,45
Lassen Sie mich wissen, wie ich die JSL-Codierung starte. Vielen Dank.
SkriptingBetreff: Spalten Daten teilen und Spaltenüberschriften umbenennenIch denke, die Lösung ist einfacher als Sie denken.Nachdem ich mir die Daten angesehen hatte und was Sie damit machen möchten, ging ich so vor, dass ich die Originaldaten Zelle für Zelle einlesen konnte, was in der ursprünglichen CSV-Datei enthalten ist.Ich untersuche dann einfach die Daten und erstelle und ändere die Spalten nach Bedarf.Hier sind meine Ergebnisse aus dem Skript am Ende meines Eintrags

Names Default To Here( 1 );
dt = Open(
"C:\JSL\Data_original.csv",
columns(
New Column( "Fruit", Character, "Nominal" ),
New Column( "ID", Numeric, "Continuous", Format( "Best", 12 ) ),
New Column( "Colors", Character, "Nominal" ),
New Column( "Weigth", Character, "Nominal" ),
New Column( "CountryCode", 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( 1 ),
Column Names Start( 1 ),
Data Starts( 2 ),
Lines To Read( "All" ),
Year Rule( "20xx" )
)
);
// Work on the Colors data
// Only keep data up to |
For Each Row( :Colors = Word( 1, :Colors, "|" ) );
// Determine the potential number of colors
// Loop through Colors data for upto 100 rows to find max number of
// colors
dt:Colors << set name( "Colors0" );
stopVal = Min( N Rows( dt ), 100 );
colorsCount = 0;
For( i = 1, i <= stopVal, i++,
cnt = 0;
While( Word( cnt + 1, Trim( :Colors0[i] ), "_" ) != "", cnt++ );
colorsCount = Max( colorsCount, cnt );
);
dt << add multiple columns( "Colors", colorsCount - 1, after( :Colors0 ), numeric );
// Change name of new column if only 2 new column is created
If( colorsCount == 2,
dt:Colors << Set name( "Colors1" )
);
For(i=1,i<=nrows(dt),i++,
for(k=1,k<=colorsCount-1,k++,
column(dt,"Colors" || char(k))[i]=num(word(k+1,:Colors0[i],"_"));
)
);
// Correct Colors0 column
For Each Row(:Colors0 = word(1,:colors0,"_"));
dt:colors0 << data type(numeric) << modeling type(continuous);
// Correct Weigth column
for each row( :Weigth = word(1,:Weigth,"|"));
dt:Weigth << set data type(numeric) << set modeling type(continuous);
// Work on the Country data
// Only keep data up to |
For Each Row( :CountryCode = Word( 1, :CountryCode, "|" ) );
// Determine the potential number of CountryCode
// Loop through CountryCode data for upto 100 rows to find max number of
// CountryCode
dt:CountryCode << set name( "CountryCode0" );
stopVal = Min( N Rows( dt ), 100 );
CountryCodeCount = 0;
For( i = 1, i <= stopVal, i++,
cnt = 0;
While( Word( cnt + 1, Trim( :CountryCode0[i] ), "_" ) != "", cnt++ );
CountryCodeCount = Max( CountryCodeCount, cnt );
);
dt << add multiple columns( "CountryCode", CountryCodeCount - 1, after( :CountryCode0 ), numeric );
// Change name of new column if only 2 new column is created
If( CountryCodeCount == 2,
dt:CountryCode << Set name( "CountryCode1" )
);
For(i=1,i<=nrows(dt),i++,
for(k=1,k<=CountryCodeCount-1,k++,
column(dt,"CountryCode" || char(k))[i]=num(word(k+1,:CountryCode0[i],"_"));
)
);
// Correct CountryCode0 column
For Each Row(:CountryCode0 = word(1,:CountryCode0,"_"));
dt:CountryCode0 << data type(numeric) << modeling type(continuous);
Dieses Beispiel ist fest auf die 3 verschiedenen | codiert Spalten, aber es könnte leicht geändert werden, um nur die Spaltenliste durchzulesen und den Spaltennamen und die Eliminierung von allem nach dem ersten | anzugeben und das Zählen des "_", das das Skript verarbeiten kann, kann so viele Spalten verarbeiten, wie es findet.
Betreff: Spalten Daten teilen und Spaltenüberschriften umbenennenHier ist eine bessere Version des Codes, und ich glaube, dass er alle | verarbeiten wird Spalten in Ihrer Datentabelle
Names Default To Here( 1 );
dt = Open(
"C:\JSL\Data_original.csv",
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( 1 ),
Column Names Start( 1 ),
Data Starts( 2 ),
Lines To Read( "All" ),
Year Rule( "20xx" )
)
);
stopVal = Min( N Rows( dt ), 100 );
// Loop across columns back to front to expand the columns as necessary
For( theColumn = N Cols( dt ), theColumn >= 3, theColumn--,
// Process if a character column
If( Column( dt, theColumn ) << get data type == "Character",
// See if a "|" is in the data value
For( i = 1, i <= stopVal + 1, i++,
If( Contains( Column( dt, theColumn )[i], "|" ),
Break()
)
);
// Get rid of everything after the first "|"
If( i <= stopVal,
For( theRow = 1, theRow <= N Rows( dt ), theRow++,
Column( dt, theColumn )[theRow] = Word( 1, As Column( dt, theColumn )[theRow], "|" )
);
// Determine the potential number of values
// Loop through the column data for upto 100 rows to find max number of values to be processed
Count = 0;
For( i = 1, i <= stopVal, i++,
cnt = 0;
While( Word( cnt + 1, Trim( Column( dt, theColumn )[i] ), "_" ) != "", cnt++ );
Count = Max( Count, cnt );
);
// If Count is == 1, then just change the column to numeric
If( Count == 1,
Column( dt, theColumn ) << data type( numeric ) << modeling type( continuous ),
origName = Column( dt, theColumn ) << get name;
Column( dt, theColumn ) << set name( origName || "0" );
Eval(
Substitute(
Expr(
dt << add multiple columns( __orig__, Count - 1, after( __col__ ), numeric )
),
Expr( __orig__ ), origName,
Expr( __col__ ), Parse( ":" || Char( Column( dt, thecolumn ) << get name ) )
)
);
// Change name of new column if only 2 new column is created
If( Count == 2,
Column( dt, origName ) << Set name( origName || "1" )
);
For( i = 1, i <= N Rows( dt ), i++,
For( k = 1, k <= Count - 1, k++,
Column( dt, origName || Char( k ) )[i] = Num( Word( k + 1, Column( dt, theColumn )[i], "_" ) )
)
);
// Correct original 0 column
For( i = 1, i <= N Rows( dt ), i++,
Column( dt, theColumn )[i] = Word( 1, Column( dt, theColumn )[i], "_" )
);
Column( dt, theColumn ) << data type( numeric ) << modeling type( continuous );
);
);
)
);
Re: Spaltendaten teilen und Spaltenüberschriften umbenennenDanke Jim für die generische Lösung. Ich validiere mit meinem Datensatz mit 10 | geteilt und 20 _ geteilt. Funktioniert perfekt!!