12

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

4

4 回答 4

12

您可以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
于 2012-10-05T17:43:18.103 回答
6

我在使用 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"
    )
  )
)
于 2013-10-25T14:29:04.967 回答
0

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”中

于 2021-02-23T04:08:34.103 回答
0

它对我不起作用,因为我的文件有 >200k 行(从另一篇文章中读取它适用于文件 <64k 行)。我修改了脚本以使用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"
    )
  )
)
于 2020-03-18T20:37:50.837 回答