我需要读取一个包含csv
数据的文本文件,其中标题分隔各个数据块。标头始终以美元符号$
开头。所以我的文本文件如下:
$Header1
2
1,2,3,4
2,4,5,8
$Header2
2
1,1,0,19,9,8
2,1,0,18,8,7
我想要做的是如果程序到达$Header2
,我想读取它后面的所有下一行,直到它到达,例如$Header3
或文件的结尾。我想我可以在Julia中使用`cmp'。我尝试使用包含以下文本的小文件:
# file julia.txt
Julia
$Julia
我的代码是:
# test.jl
fname = "julia.txt"
# set some string values
str1 ="Julia";
str2 ="\$Julia";
# print the strings and check the length
println(length(str1),",",str1);
println(length(str2),",",str2);
# now read the text file to check if you are able to find the strings
# str1 and str2 above
println ("Reading file...");
for ln in eachline(fname)
println(length(ln),",",ln);
if (cmp(str1,ln)==0)
println("Julia match")
end
if (cmp(str2,ln)==0)
println("\$Julia match")
end
end
我从上面的代码得到的输出是:
5,Julia
6,$Julia
Reading file...
6,Julia
7,$Julia
我不明白为什么从文件中读取字符串Julia
的字符长度为6,字符串$Julia
的字符长度为7。我通过打开空格来检查文本文件,但没有。我做错了什么?
答案 0 :(得分:5)
问题是eachline
返回的字符串最后包含换行符。
您可以使用chomp
将其删除:
julia> first(eachline("julia.txt"))
"Julia\n"
julia> chomp(first(eachline("julia.txt")))
"Julia"
此外,您只需使用==
代替cmp
来测试两个字符串是否相等。两者都使用ccall
到memcmp
但==
只对相同长度的字符串执行此操作,因此可能更快。