使用dos连接多个csv文件并保留第一个文件的头

时间:2014-12-30 10:30:52

标签: csv cmd

我正在尝试使用以下代码查看所有.csv文件的当前目录,并将它们连接成一个。

@echo off
ECHO Set working directory
cd /d %~dp0
ECHO Deleting existing combined file
echo '' > combined.csv
setlocal ENABLEDELAYEDEXPANSION
set cnt=1
for %%i in (*.csv) do (
  if cnt==1 (
    for /f "delims=/" %%j in ('type "%%i"') do echo %%j >> combined.csv
  ) else (
    for /f "skip=1 delims=" %%j in ('type "%%i"') do echo %%j >> combined.csv
  )
  set /a cnt+=1
)

目前它将文件连接成一个,但似乎错过了标题行并将其替换为""。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

您创建了一个文件" combined.csv"。这与*.csv

匹配

可能的解决方法:

将其命名为combined.txt,因此for %%i in (*.csv)无法识别它。完成后,将其重命名为combined.csv

顺便说一句:echo '' >file.txt不会创建空文件。它将包含''echo.>file.txt将创建一个空行的文件。要创建一个真正的空文件,最短的代码是break>file.txt

答案 1 :(得分:0)

重要部分是(并且您不需要调用delayedexpansion

set cnt=1
for %%i in (*.csv) do (
  if DEFINED cnt (
    for /f "delims=/" %%j in ('type "%%i"') do echo %%j >> combined.csv
    SET "cnt="
  ) else (
    for /f "skip=1 delims=" %%j in ('type "%%i"') do echo %%j >> combined.csv
  )
)

cnt被滥用作为反击。 if cnt==1 ( 永远不会为真 - cnt永远不会等于1cnt内容可能是1,但在这种情况下,您需要if !cnt!==1 ( - !cnt!检索cnt的当前内容1}} - 但仅在调用delayedexpansion的时候。

当某个值被用作标记时,我建议使用将变量设置为 nothing anyvalueyoulike 然后使用{的策略{1}}访问“当前是否定义了此值?”然后将值切换为某些 nothing 以更改行为。无论是否已调用if defined varname,此方法都在循环内工作。