我使用了许多包含UTF-8字符的CSV文件 - 即中国传统文件。我今天遇到一个特殊的情况,我的CSV文件的标题行是如此乱码,我需要替换它(我有确切的值这样做)。其余的CSV数据实际上很好。
我想要解决的是我如何(使用ruby)只需打开相关的CSV文件,删除现有的标题行,然后将其替换为正确的标题行,而无需加载整个文件。如果我能做到这一点而不必处理格式错误的标题,那么我将节省一些时间!
答案 0 :(得分:0)
CSV文件不是由固定长度的记录组成,而是通常是由可变长度字符串组成的文件。因此,如果不读取整个文件,则无法删除或插入行。
只要更改的内容与旧文本完全相同(以字节为单位),就可以更改该行,但这种情况不太可能。
相反,我会做这样的事情:
"w"
模式打开新文件。"r"
模式打开旧(CSV)文件,就像它是文本文件一样。$.
查看您是否在第一行。如果是这样,请跳到循环结束。$.
大于第一行,请写下该行。这是在Ruby中实现但未经过测试的相同想法:
NEW_HEADER = 'some, csv, header'
File.open('new_csv_file', 'w') do |fo|
File.foreach('old_csv_file') do |li|
if $. > 1
fo.puts li
else
fo.puts NEW_HEADER
end
end
end
就像我说的那样,它没有经过测试,但这应该让你开始。
$。办?
引用关于$.
的“Ruby编程语言”:
从当前输入文件读取的最后一行的编号。相当于
ARGF.lineno
。英语同义词:$NR
,$INPUT_LINE_NUMBER
。
这是一个Perl-ism,如果我没记错的话可能会从shell继承它。