逐行读取 CSV 以查找数据开始的位置我需要加载一个可能有多种不同格式的 CSV 文件。 我需要找到我的数据从哪一行开始。 我知道列名在某一行之后开始,比方说“[数据从这里开始]”。
这就是我所做的:
ex = Load Text File(
filePath
);
words = Words( ex, "\!n\!r" );
headersLocation = Loc(words, "[Data starts here]");
然后我使用 headersLocation+1 指定标题的起始位置。
当我的 CSV 文件中有一个空行时,就会出现问题:
line1
line2
[Data Starts Here]
Header1, header2
0,0
1,1
当我将这个文件分解成单词时,行“[Data STarts Here]”将是第三行,Loca() 函数在这种情况下会给我 3,而实际上它是第 4 行。
因此,当通过 Words 函数中断文件时,空行不会进入列表。
而且我不知道在数据开始之前文件中可能有多少空行。
我该怎么做?
我可以仅通过“\!n”或“\!r”来中断,然后在 for 循环中使用 Left() 或 Right() 来删除剩余的特殊符号,但它似乎过于蛮力而且不是非常理想并且我不确定它是否正确。 是这样的:
For Each( {value, index}, words, words[index] = Right(value, Length(value)-1););整个脚本是:
ex = Load Text File(
filePath
);
words = Words( ex, "\!n\!r" );
For Each( {value, index}, words, words[index] = Right(value, Length(value)-1););
headersLocation = Loc(words, "[Data starts here]");然后它似乎正在工作。 但这是最好的甚至是正确的解决方案吗?
脚本回复:逐行读取 CSV 以查找数据开始的位置嗯... 有趣的建议。 让我试试。 毕竟这可能更容易。
回复:逐行读取 CSV 以查找数据开始的位置您需要 JMP 数据导入平台的位置吗? 如果您不需要 [Data Starts Here] 之前的数据,您可以将其删除
Names Default To Here(1);
csv = "line1
line2
[Data Starts Here]
Header1, header2
0,0
1,1
";
string_to_search = "[Data Starts Here]";
data_start_idx = Contains(csv, string_to_search);
data_str = Substr(csv, data_start_idx + Length(string_to_search) + 1);
如果您需要 JMP 的导入,您可以将 Char To Blob() 与您现在拥有的字符串一起使用:
dt = Open(
Char To Blob(data_str),
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")
)
);