【问题标题】:How to delete the first line of a csv? (ruby)如何删除csv的第一行? (红宝石)
【发布时间】:2010-08-15 02:02:48
【问题描述】:

我有一个大的 csv。我想删除文件的第一行。这是怎么做的?我不想将每一行复制到一个数组中并为前一个索引重写它们并删除第一个。一定有更好的办法。

谢谢

【问题讨论】:

    标签: ruby text csv


    【解决方案1】:

    虽然 Guffa 认为可以在标题中使用换行符是正确的,但这并不常见,所以如果您可以忽略这种边缘情况,您可以使用:

    File.open('new.csv', 'w+') do |outf|
      File.open('original.csv') do |inf|
        inf.each_line.with_index do |line, i|
          outf.write line unless i==0
        end
      end
    end
    

    如果这对您来说太慢了,请告诉我,我们将重写它以使用块读取而不是实际解析整个文件。

    【讨论】:

      【解决方案2】:

      嗯,你可以走一些捷径,但有几件事是你无法绕开的:

      • 根据编码,字符可能不会映射到文件中的单个字节,因此您必须将其作为文本读取。

      • 您必须至少解析文件的第一条记录。 CSV 格式不是基于行的,尽管它使用换行符来分隔记录。一个值也可以包含一个换行符,所以你不能只读到第一个换行符就认为这是第一条记录。

      • 没有办法删除文件的一部分,所以无论你做什么,你仍然需要重写整个文件。

      因此,您可以解析标题(如果有)和第一条记录,然后您可以将文件的其余部分作为纯文本读取。然后您可以将其余部分写回第一条记录开始的位置(或从文件开头写入并包含标题)。

      【讨论】:

      • 为什么仅仅因为字段包含未转义的特殊字符就意味着“CSV 格式不是基于行的”?但是,我同意您永远不应假设文件格式正确。
      • @klynch:这意味着您不能只读取一行然后将其解析为一条记录,因为一条记录可能跨越几行。这不是因为它的格式不正确,尽管这是一个很好的观点。例如,如果记录末尾的值为空,Excel 可能会遗漏值,因此您不能假设所有记录都具有相同数量的值。
      猜你喜欢
      • 1970-01-01
      • 2014-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多