【问题标题】:How to remove Header from a CSV FileStream如何从 CSV 文件流中删除标题
【发布时间】:2020-05-20 18:22:07
【问题描述】:

我必须解决 csv 文件上传的某些限制:

  • 我将使用“大型”CSV 文件(包含标题行)
  • 我需要从 CSV 文件中删除第一个标题行
  • 文件上传代码需要一个FileStream(不包含标题)作为输入! (因为我被限制在这个流之上做很多流操作(包含无标题的 csv 数据))

包装 C# 代码:

using (var stream = File.OpenRead("C:\~~~\~~~\~~~\SampleFile.csv"))
{
    //CSV Header removal snippet - which gives me a new stream containing data without headers.
    ~
    ~
    ~
    ~
    //All my stream handling code of chunking stream into 100mb and then uploading each chunk to azure storage (which is not part of this question)
}

现在我已经知道 - 我可以简单地使用库删除 csv 文件的标题 - CSVHelper
(How to exclude header when writing data to CSV)

使用上述方式,我可以创建文件的无标题副本并将新文件作为 FileStream 读回 - 但问题是我正在处理大文件并制作文件副本只是为了删除标题将是一项占用空间的工作。

所以第一次 - 我在 StackOverflow 中提出一个问题 - 为上述问题找到一个好的解决方案。我希望我能够清楚地解释这个问题。

【问题讨论】:

  • 使用 StreamReader 然后 ReadLine() 删除第一行。
  • 所以我可以获取流并将其传递给流阅读器 - 然后执行 readline() 但随后 - 原始“流”对象是否没有标题?
  • ReadLine() 方法给出了第一行 - 但这弄乱了流的位置,我希望我的流的位置移动到标题行的末尾
  • 标题行的结尾是在行尾的return之前还是之后? CSV 文件中的每一行在行尾都有一个回车符。

标签: c# file-handling csvhelper


【解决方案1】:

这应该可以搜索到第一行的末尾。

using (var stream = File.OpenRead("~~filepath~~"))
using (var reader = new StreamReader(stream))                
{
    string line = null;
    if ((line = reader.ReadLine()) != null)
    {        
        stream.Position = line.Length + 2;
        // The 2 is for NewLine(\r\n)
    }

    //All my stream handling code of chunking stream into 100mb and then uploading each chunk to azure storage (which is not part of this question)   
}

【讨论】:

  • 所以我通过 line.length + 2 得到了答案,所以我会将您的答案标记为正确答案,但是我发现您不必阅读文件 2 次。
  • 您可以简单地读取流,在阅读器中使用它,然后在 if 条件中设置 stream.position = offset... 这将有利于大文件处理..
猜你喜欢
  • 1970-01-01
  • 2016-12-07
  • 2020-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-06
  • 1970-01-01
  • 2014-10-15
相关资源
最近更新 更多