クリーンアップする必要がある CSV ファイルがいくつかあります。問題のファイルには 2 つの基本的なデータ ブロック構造があります。最初のブロックは、7 行の情報を含む 1 列で構成されます。2 番目のセグメントには、5 行以上のデータを含む 6 つの列が含まれています。
最初のブロックの理想的な変換は、列を 2 つの部分に分割することです。1 つは列のヘッダーまたは名前を提供します。 そして、2 番目の部分は、その特定の実験に関するデータ情報を提供します。
2 番目のブロックには最小限の介入が必要です。
これまでのところ、いくつかの厄介な点を除いて、なんとか望ましい状態に近づくことができました。まず、csv ファイルを 2 つの部分 (2 つのテーブル) に分割することは問題ありません。最初のデータ テーブル –dt1- は元の CSV ファイルであり、このファイルからデータが抽出され、一部の行が削除されて 2 番目のデータ テーブル –dt2 が作成されます。2 番目のデータ テーブルには 1 列と 7 行が含まれています。さらなる治療が必要な場合。
これを行うには、新しいデータ テーブル -dt3 から始めます。For ループを使用して列見出しを作成し、リストの最初の要素を取得することに成功しました。この情報は dt2 から得られます。次の部分が私に問題を引き起こしている部分です。リストの 2 番目の要素を dt3 の最初の行に渡すか送信する必要があります。
最初の質問:
次の行は元のデータ テーブル (dt1) の列 1 の最初のセルを変更できるのに、次のコードが新しいデータ テーブルでは機能しないのはなぜですか?
dt1[1,1]=300; //これは機能します
dt3[1,1]=300; //これは動作しません。エラーが発生します。
'Assign' のアクセスまたは評価における無効な添え字 (数値または数値のリストである必要があります)、 dt3[1, 1] = /*###*/300 /*###*/
2番目の質問
文字識別子として : を使用して、最初の 7 行をヘッダー情報と行データに分割します。このアプローチの欠点は、日付/時刻行にこれらの文字が 3 つ含まれており、2 番目に見つかった : 以降のデータが失われることです。これを防ぐにはどうすればよいでしょうか?
何かアイデアや提案はありますか? 添付の Excel ファイルはデータテーブルの例です。
ご協力ありがとうございました
元のcsvファイルの例
料理レシピ: 1-濃厚ソース | | | |
ブレンダーレシピ: 3スピード | | | |
温度レシピ: 100 スチーム | | | |
調理器具: ステンレス | | | |
バッチID: ミニケーキ-100 | | | |
サンプルID: Mini-Cake-100.1 | | |
日時: 2017/6/30 午後 4:12:44 | | |
| | | | | |
| | | | | |
点 | 密度 | 砂糖 | 比 | バツ | 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 |
データテーブル 2 (dt2) の例。 1 列に 7 行。 : は列名と実験情報を区切ります。
料理レシピ: 1-濃厚ソース |
ブレンダーレシピ: 3スピード |
温度レシピ: 100 スチーム |
調理器具: ステンレス |
バッチID: ミニケーキ-100 |
サンプルID: Mini-Cake-100.1 |
日時: 2017/6/30 午後 4:12:44 |
dt2 の望ましい変換。
食べ物のレシピ | ブレンダーのレシピ | 温度レシピ | 調理器具 | バッチID | サンプルID | 日付時刻 |
1-濃厚ソース | 3速 | 100 スチーム | ステンレス | ミニケーキ-100 | ミニケーキ-100.1 | ######### |
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>
最初の問題は、dt3 データ テーブルに行がないことです。 追加すると
dt3 << add rows(N Rows( dt2 ));
dt3 を作成した直後に、そのテーブルにデータを入力できるようになります。
2 番目の問題は、必要なのは文字列の 2 番目の Word ではなく、最初の「:」に続くすべてであるということです。 したがって、Substr() 関数を使用するとより適切に機能します。
dt3[iii, 1] = Trim Whitespace( substr(Column( dt2, 1 )[iii], contains(column( dt2, 1 ), ":") ) )