从CSV中删除标题行

时间:2013-09-05 14:51:29

标签: excel csv batch-file

我有一个包含各种数据的大约3k个CSV文件的目录,我需要在某些时候将这些文件整理成一个文件,但首先我需要删除每个文件中的所有标题行。

通常为此我会整理文件,然后只需在Excel中打开,并在删除它们之前过滤到标题行。不幸的是,这些总和大约9M行,而Excel不喜欢这样......

有人可以想办法解决这个问题吗?最好是某种批处理脚本,它将运行目录中的所有文件。

提前致谢,

一个。

2 个答案:

答案 0 :(得分:1)

以下假设每个文件的第一行是要删除的标题行。

只有当所有文件都不包含<TAB>字符且没有任何文件太大时,它才能正常工作。我不记得具体细节,但是在某些时候,如果输入文件太大,那么带有重定向输出的MORE会挂起等待按键。

(for %F in (*.csv) do @more +1 "%F") >concat_csv.txt

我确保为输出文件提供不同的扩展名,以便命令不会尝试处理输出!另一种方法是将输出重定向到CSV文件,但位于不同的文件夹中。

如果要在批处理文件中使用此功能,请将百分比加倍(%F变为%%F

答案 1 :(得分:0)

我不确定这是你在找什么......这是摆脱C#中重复标题的一种方法。代码的主要目的是存储一个标头string header并通过跳过第一行(while (rdr.Peek() != -1))来读取文件。

我还使用字典来存储每个csv文件的行。这将防止包含不同csv文件中的重复行(我不确定此函数在您的情况下是否有用)。

想象一下fname是一个字符串数组,其中包含您要合并的文件。

    Dictionary<string, string> dict = new Dictionary<string, string>();
    string destinationFile = <write path of your destination file>;
    string dir = <write path of your original directory>
    string header = "";

    if (dir.Length != 0)
    {
       foreach (string f in fnames)
       {
          using (StreamReader rdr = new StreamReader(dir + "\\" + f))
          {
             header = rdr.ReadLine();

             while (rdr.Peek() != -1)
             {
                 string ln = rdr.ReadLine();
                 string[] split_ln = ln.Split(',');

                 string value = (split_ln.Length != 2) ? string.Join(",", split_ln.Skip(1)) : split_ln[1];
                 dict.Add(split_ln[0], value);

              }
           }
        }

        using (StreamWriter wr = new StreamWriter(destinationFile))
        {
           wr.WriteLine(header);
           foreach (var pair in dict)
           {
              wr.WriteLine("{0},{1}", Convert.ToString(pair.Key), pair.Value);
           }
        }
     }