1

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

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

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

提前致谢,

一个。

4

2 回答 2

2

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

<TAB>只有在没有文件包含该字符且没有文件太大的情况下,它才能正常工作。我不记得具体细节,但在某些时候,如果输入文件变得太大,带有重定向输出的 MORE 将挂起等待按键。

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

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

如果您想在批处理文件中使用它,则将百分比加倍(%F变为%%F

于 2013-09-05T15:58:14.883 回答
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);
           }
        }
     }
于 2013-09-05T15:02:45.123 回答