J'ai plusieurs fichiers csv qui doivent être nettoyés.Les fichiers en question ont deux structures de blocs de données de base.Le premier bloc se compose de 1 colonne avec 7 rangées d'informations.Le deuxième segment contient 6 colonnes avec plus de 5 lignes de données.
Pour le premier bloc, la transformation idéale consiste à casser la colonne en deux morceaux.Une pièce fournira l'en-tête ou le nom de la colonne. Et, la deuxième pièce fournira des informations sur les données de cette expérience spécifique.
Le deuxième bloc nécessite une intervention minimale.
Jusqu'à présent, j'ai réussi à me rapprocher de l'état souhaité, à l'exception de quelques points persistants.Tout d'abord, diviser le fichier csv en deux parties - deux tables - n'est pas un problème.La première table de données -dt1- est le fichier csv d'origine à partir duquel les données sont extraites et certaines lignes supprimées pour créer une deuxième table de données -dt2.La deuxième table de données contient la colonne 1 avec 7 lignes ; qui nécessitent un traitement complémentaire.
Pour ce faire, je commence par une nouvelle table de données -dt3.J'ai réussi à créer les en-têtes de colonne avec une boucle For et à prendre le premier élément d'une liste.Ces informations proviennent de dt2.La partie suivante est celle qui me pose problème.J'ai besoin de passer ou d'envoyer le deuxième élément de la liste à la première ligne de dt3.
Première question:
Pourquoi la ligne suivante est capable de changer la première cellule de la colonne 1 dans la table de données d'origine (dt1) mais le morceau de code suivant ne fonctionne pas sur la nouvelle table de données ?
dt1[1,1]=300 ; //cela marche
dt3[1,1]=300 ; //cela ne fonctionne pas.Il produit une erreur.
indice invalide (doit être un nombre ou une liste de nombres) dans l'accès ou l'évaluation de 'Assign' , dt3[1, 1] = /*###*/300 /*###*/
Deuxième question
J'utilise : comme identificateur de caractère pour séparer les sept premières lignes en informations d'en-tête et données de ligne.L'inconvénient de cette approche est que la ligne Date/Heure contient 3 de ces caractères et que les données sont perdues après la seconde trouvée :.Comment puis-je empêcher que cela se produise ?
Des idées ou des suggestions? Le fichier Excel ci-joint est un exemple de tableau de données.
Merci beaucoup pour toute aide
Exemple de fichier csv d'origine
Recette alimentaire : 1 sauce épaisse | | | |
Recette du mélangeur : 3 vitesses | | | |
Recette de température : 100 Vapeur | | | |
Quincaillerie de cuisson : Inox | | | |
ID de lot : Mini-Gâteau-100 | | | |
ID d'échantillon : Mini-Gâteau-100.1 | | |
Date/Heure : 30/06/2017 16:12:44 | | |
| | | | | |
| | | | | |
Indiquer | Densité | Sucre | Rapport | X | Oui |
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 |
Exemple de tableau de données 2 (dt2). 1 colonne avec 7 rangées. Le : sépare le nom de la colonne des informations expérimentales.
Recette alimentaire : 1 sauce épaisse |
Recette du mélangeur : 3 vitesses |
Recette de température : 100 Vapeur |
Quincaillerie de cuisson : Inox |
ID de lot : Mini-Gâteau-100 |
ID d'échantillon : Mini-Gâteau-100.1 |
Date/Heure : 30/06/2017 16:12:44 |
Transformation souhaitée de dt2.
Recette de nourriture | Recette de mélangeur | Recette de température | Matériel de cuisson | ID de lot | Identifiant de l'échantillon | Date/Heure |
1-Sauce épaisse | 3 vitesses | 100 Vapeur | Inoxydable | Mini-Gâteau-100 | Mini-Gâteau-100.1 | ######### |
Code JSL
<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>
Votre premier problème est qu'il n'y a pas de lignes dans votre table de données dt3. Si vous ajoutez
dt3 << add rows(N Rows( dt2 ));
juste après avoir créé dt3, vous pourrez remplir cette table.
Le deuxième problème est que ce que vous voulez n'est pas le deuxième mot de la chaîne, mais plutôt tout ce qui suit le premier ":". Par conséquent, l'utilisation de la fonction Substr() fonctionnera mieux :
dt3[iii, 1] = Trim Whitespace( substr(Column( dt2, 1 )[iii], contains(column( dt2, 1 ), ":") ) )