使用ruby格式化CSV的标题行

时间:2014-03-04 17:52:30

标签: ruby csv

我使用了许多包含UTF-8字符的CSV文件 - 即中国传统文件。我今天遇到一个特殊的情况,我的CSV文件的标题行是如此乱码,我需要替换它(我有确切的值这样做)。其余的CSV数据实际上很好。

我想要解决的是我如何(使用ruby)只需打开相关的CSV文件,删除现有的标题行,然后将其替换为正确的标题行,而无需加载整个文件。如果我能做到这一点而不必处理格式错误的标题,那么我将节省一些时间!

1 个答案:

答案 0 :(得分:0)

CSV文件不是由固定长度的记录组成,而是通常是由可变长度字符串组成的文件。因此,如果不读取整个文件,则无法删除或插入行。

只要更改的内容与旧文本完全相同(以字节为单位),就可以更改该行,但这种情况不太可能。

相反,我会做这样的事情:

  1. "w"模式打开新文件。
  2. 将新标题写入其中。
  3. 使用"r"模式打开旧(CSV)文件,就像它是文本文件一样。
  4. 阅读一行。
  5. 使用$.查看您是否在第一行。如果是这样,请跳到循环结束。
  6. 如果$.大于第一行,请写下该行。
  7. 循环到#4。
  8. 关闭输入文件。
  9. 关闭输出文件。
  10. 这是在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继承它。