【问题标题】:Batch Combine CSV Remove Header批量合并 CSV 删除标题
【发布时间】:2021-05-13 23:28:06
【问题描述】:

我有多个具有相同标题的 CSV 文件,我正在尝试将它们以批处理方式组合在一起并只保留一个标题。有什么想法吗?

【问题讨论】:

  • 是否有您希望保留标题的特定文件(即:只有第一个 csv 文件,还是只有最后一个?)或者所有文件都有相同的标题?

标签: windows csv batch-file cmd


【解决方案1】:

1.) 将所有 CSV 文件复制到一个文件夹中。 2.) 在提示运行时:复制 *.csv combined.csv (为方便起见,制作一个批处理文件运行) 3.) 从 Visual Studio 编译以下代码以制作 CombiCSV.exe

#include <fstream>
#include <iostream>
#include <string>
using namespace std;
int main()
{
    string first_line, line;
    ifstream myfile("combined.csv");
    ofstream outfile("allcsv.csv");  // opens output.txt for writing
    //if (myfile)  // same as: if (myfile.good())
    //  {
    getline(myfile, first_line); // get the first line of original
    cout << first_line << endl;
    outfile << first_line; // write first line to outfile
    outfile << '\n';  //new line delimiter
    while (getline(myfile, line))  // same as: while (getline( myfile, line ).good())
    {
        if (line != first_line) //check line whether equal to first line (header)
        {
            outfile << line; //if not just write to output
            outfile << '\n';  //new line delimiter
            cout << line << endl;
        }
    }
    myfile.close();
    outfile.close();
    cout << "Copy End.\n";
    //}
  //else cout << "Failed\n";
    return 0;
}

上面的程序 CombiCSV.exe 将打开默认的“combined.csv”文件,保留第一行作为标题,并在读取和写入记录期间删除重复,直到 eof。结果存储在“allcsv.csv”中

【讨论】:

    【解决方案2】:

    它对我不起作用,因为我的文件有 >200k 行(从另一篇文章中读取它适用于文件 sed 来代替打印行。

    -n : 安静,禁止自动打印所有行

    1,$:第一行到最后一行

    p : 打印匹配模式的行

    @echo off
    setlocal
    set first=1
    set fileName="combinedFiles.csv"
    >%fileName% (
      for %%F in (*.csv) do (
        if not "%%F"==%fileName% (
          if defined first (
            sed -n 1,$p "%%F"
            set "first="
          ) else sed -n 2,$p "%%F"
        )
      )
    )
    

    【讨论】:

      【解决方案3】:

      您可以使用MORE +1 输出除第一行以外的所有内容。

      >new.csv (
         type file1.csv
         more +1 file2.csv
         more +1 file3.csv
         REM etc.
      )
      

      显然,您可以根据需要调整每个文件中要跳过的行数。

      合并当前文件夹中的所有 csv 文件: 编辑:修改为不使用新创建的输出 csv 作为输入

      @echo off
      setlocal
      set first=1
      >new.csv.tmp (
        for %%F in (*.csv) do (
          if defined first (
            type "%%F"
            set "first="
          ) else more +1 "%%F"
        )
      )
      ren new.csv.tmp new.csv
      

      显然,这仅在所有 csv 文件共享相同格式时才有效。

      编辑 2015-07-30: 有一些限制:

      • 制表符将被转换为一串空格
      • 每个 CSV 源文件的行数不得超过 64k

      【讨论】:

      • 为什么第一个例子限制在 64k 行?
      • 这个解决方案在最后一行给出了我的记录和-- More (13%) --,然后我必须按回车键,然后插入一个新的CSV行加上-- More (13%) --...如何避免?谢谢!
      • @ragesz - 在我看来,您遇到了 64k 行限制,因此此解决方案无法为您工作。当重定向的 MORE 遇到 64k 行时,它会按照您的描述暂停。
      • EDIT - 删除了伪造的 FOR /F 尝试忽略新创建的 .CSV 文件。它无法工作,因为输出文件是在 FOR /F 之前创建的。
      【解决方案4】:

      我在使用 dbenham 合并当前文件夹中所有 CSV 文件的方法时遇到问题。它偶尔会拾取生成的 CSV 并将其包含在集合中。我已经对其进行了修改以避免此问题。

      @echo off
      setlocal
      set first=1
      set fileName="combinedFiles.csv"
      >%fileName% (
        for %%F in (*.csv) do (
          if not "%%F"==%fileName% (
            if defined first (
              type "%%F"
              set "first="
            ) else more +1 "%%F"
          )
        )
      )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-10-15
        • 1970-01-01
        • 1970-01-01
        • 2017-09-09
        • 2015-04-05
        • 2011-06-25
        相关资源
        最近更新 更多