données de colonnes diviser et renommer les en-têtes de colonneSalut,
J'ai Data_original.csv qui a de nombreuses colonnes de | ou _ ou aucun. Dans cet exemple, je montre seulement 3 colonnes de |.
J'ai essayé l'aperçu des données pour voir si je pouvais diviser mais ma colonne a été foirée.
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" )
)
);
Tout d'abord, je veux ouvrir Data_original.csv. Supprimer toutes les colonnes de | split (le cas échéant et ne conserver que la première valeur fractionnée). Je pensais qu'une fois que je me suis séparé, je devrais pouvoir supprimer n'importe quel nom d'en-tête de colonne avec Column * et l'enregistrer dans csv.
Voir la sortie de 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
Deuxièmement, je veux ouvrir le csv de sauvegarde précédent, Data_original_EDIT1.csv.Divisé par _ colonne (le cas échéant) et renommez l'en-tête de colonne comme le même en-tête de colonne mais concaténez une séquence 0..n.
Voir Data_original_EDIT2_Final.csv, l'exportation de sortie finale vers 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
Faites-moi savoir comment je lance le codage JSL. Merci.
ScriptingRe: diviser les données des colonnes et renommer les en-têtes de colonnesJe pense que la solution est plus simple que vous ne le pensez.Après avoir examiné les données et ce que vous voulez en faire, j'ai choisi de lire les données d'origine, cellule par cellule, de ce qui se trouve dans le fichier csv d'origine.J'examine ensuite simplement les données et crée et modifie les colonnes selon les besoins.Voici mes résultats du script en bas de mon entrée

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);
Cet exemple est codé en dur sur les 3 différents | colonnes, mais il pourrait facilement être modifié pour simplement lire la liste des colonnes, et étant donné le nom de la colonne, et l'élimination de tout après le premier | et le comptage des "_" que le script pourrait gérer autant de colonnes qu'il trouve.
Re: diviser les données des colonnes et renommer les en-têtes de colonnesVoici une meilleure version du code, et je crois qu'elle gérera tout | colonnes de votre tableau de données
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 : fractionner les données des colonnes et renommer les en-têtes de colonnesMerci Jim pour la solution générique. Je valide avec mon jeu de données avec 10 | split et 20 _ split. Fonctionne parfaitement!!