从多个csv文件中删除标头

时间:2016-12-02 08:25:05

标签: batch-file cmd

我每天都有多个csv文件来自不同的服务器。这些文件很大(超过200 MB)。我必须删除所有这些csv文件的标头 并使用批处理文件将它们替换为必需的列标题。

以下代码可以正常删除单个文件中的列标题:

@echo off
set "csv=mycsv.csv">"%csv%.new"
(
    for /f skip^=1^ usebackq^ delims^=^ eol^= %%A in ("%csv%") do echo %%A
)
move /y "%csv%.new" "%csv%" >nul

3 个答案:

答案 0 :(得分:1)

鉴于CSV文件不包含任何 TAB 字符(由使用过的more命令替换为 SPACE 字符序列)并且没有文件长度超过65534行(在这种情况下more需要用户交互),您可以尝试以下方法之一:

  1. 新列标题由另一个文件headerfile.csv

    提供
    < "headerfile.csv" set /P "HEADER="
    for %%F in ("*.csv") do (
        if /I not "%%~F"=="headerfile.csv" (
            > "%%~F.tmp" echo(%HEADER%
            >>"%%~F.tmp" more +1 "%%~F"
            move /Y "%%~F.tmp" "%%~F"
        )
    )
    

    如果headerfile.csv不在所有其他CSV文件所在的当前目录中,则可能不希望将其排除在外;然后只需删除if查询。

  2. 新列标题以字符串常量形式给出:

    set "HEADER=new,header,string,here"
    for %%F in ("*.csv") do (
        > "%%~F.tmp" echo(%HEADER%
        >>"%%~F.tmp" more +1 "%%~F"
        move /Y "%%~F.tmp" "%%~F"
    )
    
  3. 更新

    这是一种不使用more命令的方法,因此其限制不再适用。它也没有使用for /F来限制每行的长度为8191字节/字符:

    1. 新列标题由另一个文件headerfile.csv

      提供
      < "headerfile.csv" set /P "HEADER="
      for %%F in ("*.csv") do (
          if /I not "%%~F"=="headerfile.csv" (
              > "%%~F.tmp" echo(%HEADER%
              >>"%%~F.tmp" < "%%~F" (set /P = & findstr "^")
              move /Y "%%~F.tmp" "%%~F"
          )
      )
      
    2. 新列标题以字符串常量形式给出:

      set "HEADER=new,header,string,here"
      for %%F in ("*.csv") do (
          > "%%~F.tmp" echo(%HEADER%
          >>"%%~F.tmp" < "%%~F" (set /P = & findstr "^")
          move /Y "%%~F.tmp" "%%~F"
      )
      
    3. 请注意,标题行仍然限制为8191个字节/字符,因为它存储在变量中(为了避免多个文件读取操作),也存储在相关的echo(%HEADER%命令行中限制在那个大小。要克服此限制,请仅将标题放入文本文件中,并在循环中将其复制到%%~F.tmp,然后再附加数据。

答案 1 :(得分:0)

for /f "delims=" %%a in (*.csv) do echo %%a>csv.new&goto mainbody
:mainbody
for /f "skip=1delims=" %%a in (*.csv) do echo %%a>>csv.new

应该做你想做的事情,使用无处不在的水晶球来掠夺“必需的列标题”来表示“.csv文件中的列标题”

答案 2 :(得分:0)

您甚至可以使用MORE:

For %%A In (*.csv) Do More +1 "%%A" 1>%%~nA.new

注意 - 此方法会将所有标签转换为空格