我每天都有多个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
答案 0 :(得分:1)
鉴于CSV文件不包含任何 TAB 字符(由使用过的more
命令替换为 SPACE 字符序列)并且没有文件长度超过65534行(在这种情况下more
需要用户交互),您可以尝试以下方法之一:
新列标题由另一个文件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
查询。
新列标题以字符串常量形式给出:
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"
)
这是一种不使用more
命令的方法,因此其限制不再适用。它也没有使用for /F
来限制每行的长度为8191字节/字符:
新列标题由另一个文件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"
)
)
新列标题以字符串常量形式给出:
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"
)
请注意,标题行仍然限制为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
注意 - 此方法会将所有标签转换为空格