我有几个 csv 文件需要清理。相关文件有两个基本数据块结构。第一个块由 1 列 7 行信息组成。第二段包含 6 列和 5 行以上的数据。
对于第一个块,理想的转换是将柱子分成两部分。一件将提供列的标题或名称。 并且,第二部分将提供有关该特定实验的数据信息。
第二块需要最少的干预。
到目前为止,除了一些令人烦恼的问题之外,我已经接近理想的状态。首先,将 csv 文件分成两部分(两个表)不是问题。第一个数据表 –dt1- 是原始 csv 文件,从中提取数据并删除一些行以创建第二个数据表 –dt2。第二个数据表包含1列7行;哪些需要进一步治疗。
为此,我从一个新的数据表 -dt3 开始。我已成功使用 For 循环创建列标题并获取列表的第一个元素。该信息来自dt2。下一部分是给我带来问题的部分。我需要将列表的第二个元素传递或发送到 dt3 的第一行。
第一个问题:
为什么以下行能够更改原始数据表(dt1)中第 1 列的第一个单元格,但下一段代码不适用于新数据表?
dt1[1,1]=300; //这有效
dt3[1,1]=300; //这不起作用。它会产生错误。
访问或评估 'Assign' 时下标无效(必须是数字或数字列表),dt3[1, 1] = /*###*/300 /*###*/
第二个问题
我使用 : 作为字符标识符将前七行分隔为标题信息和行数据。这种方法的缺点是日期/时间行有 3 个这样的字符,并且在找到第二个 : 后数据就会丢失。我怎样才能防止这种情况发生?
有什么想法或建议吗? 附件中的 Excel 文件是数据表的示例。
非常感谢您的帮助
原始 csv 文件示例
菜谱: 1-浓酱 | | | |
搅拌机配方:3 速 | | | |
温度配方:100蒸汽 | | | |
烹饪用具:不锈钢 | | | |
批次 ID:Mini-Cake-100 | | | |
样品 ID:Mini-Cake-100.1 | | |
日期/时间:2017 年 6 月 30 日下午 4:12:44 | | |
| | | | | |
| | | | | |
观点 | 密度 | 糖 | 比率 | X | 是 |
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:Mini-Cake-100 |
样品 ID:Mini-Cake-100.1 |
日期/时间:2017 年 6 月 30 日下午 4:12:44 |
dt2 的所需转换。
食物食谱 | 搅拌机配方 | 温度配方 | 烹饪五金 | 批次编号 | 样品编号 | 约会时间 |
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 后,您将能够填充该表。
第二个问题是,您想要的不是字符串的第二个单词,而是第一个“:”之后的所有内容。 因此,使用 Substr() 函数效果会更好:
dt3[iii, 1] = Trim Whitespace( substr(Column( dt2, 1 )[iii], contains(column( dt2, 1 ), ":") ) )