Batch file 批处理文件将多个文件中的文本合并为一个csv
我在一个网站上看到了这段代码,它是前一个堆栈溢出线程的派生,但这正是我试图利用批处理来完成的。我很少使用batch,虽然看起来它应该产生预期的最终结果,但它并没有完全达到我想要的效果,任何和所有的帮助都将不胜感激。在代码下面,我给出了一个我试图实现的示例Batch file 批处理文件将多个文件中的文本合并为一个csv,batch-file,cmd,Batch File,Cmd,我在一个网站上看到了这段代码,它是前一个堆栈溢出线程的派生,但这正是我试图利用批处理来完成的。我很少使用batch,虽然看起来它应该产生预期的最终结果,但它并没有完全达到我想要的效果,任何和所有的帮助都将不胜感激。在代码下面,我给出了一个我试图实现的示例 @echo off set local EnableDelayedExpansion for %%f in (*.txt) do ( set i=0 for /F "delims=" %%l in (%%f) do ( set
@echo off
set local EnableDelayedExpansion
for %%f in (*.txt) do (
set i=0
for /F "delims=" %%l in (%%f) do (
set /A i+=1
set line!i!=%%l
)
echo %%f, !line1!, !line2!, !line3!, >> result.csv
text file 1 text file 2 text file 3 >> output.csv
1111, 2222, 3333 1111,2222,3333
1111, 2222, 3333 1111,2222,3333
1111, 2222, 3333 1111,2222,3333
1111, 2222, 3333 1111,2222,3333
@ECHO关闭
SETLOCAL ENABLEDELAYEDEXPANSION
设置“sourcedir=U:\sourcedir”
设置“destdir=U:\destdir”
设置“tempfile=%temp%\tempfile.txt”
设置“outfile=%destdir%\outfile.txt”
(
对于%%f英寸(
Q4250455_0.txt Q4250455_1.txt Q4250455_2.txt Q4250455_3.txt Q4250455_4.txt Q4250455_5.txt
)DoFindStr/n/r.““%sourcedir%\%%f”
)>%tempfile%
设置/a最大线=0
对于/f“usebackqtokens=1delims=:”(“%tempfile%”)中的%%a,如果%%a gtr!麦克斯林!设置/a最大线=%%a
(
对于/L%%L英寸(1,1,%maxline%)的DO(
设置“行=”
对于/f“usebackqtokens=1*delims=:”(“%tempfile%”)中的%%a,如果%%a==%L,则执行该操作(
设置“行=!行!%%b”
)
回声!线路!
)
)>“%outfile%”
删除“%tempfile%”>NUL 2>NUL
后藤:EOF
您需要更改sourcedir
和destdir
的设置以适应您的环境
我使用了名为Q4250555*.txt
的文件,其中包含测试数据
生成定义为%outfile%的文件
第一个for
循环只是对列表中每个文件的每一行进行编号,并将结果输出到临时文件(其名称无关)。结果是一个包含
1:line1 from file1
2:line2 from file1
...
1:line1 from file2
2:line2 from file2
...
下一个for
循环只计算使用的最大行号,通过使用:
作为分隔符,将行号标记为%%a
下一节将行号计数到%%L
,然后根据temp文件中匹配的行号构建行。由于tempfile按指定文件的顺序包含行n,因此拾取每行n并将它们串在一起将按照指定的顺序构建该行
请注意,我怀疑您的数据是否已发布,除了最后一个文件外,每行都有终端,
。我认为该,
缺失,该过程将插入,
作为分隔符
如果是这样,那么所需的更改是:
...
SET "line=!line!,%%b"
)
ECHO !line:~1!
...
若要插入逗号,请将所有行栏中的第一个字符都回显。此方法执行一个文件一个文件的直接合并,在一个文件的行数少于其他文件时调整行数
@echo off
setlocal EnableDelayedExpansion
rem Set the current directory where the Batch file is
cd "%~P0"
set "comma="
del result.csv 2>NUL
for %%f in (*.txt) do (
rem If this is the first file
if not exist result.csv (
rem ... just copy it
copy "%%f" result.csv > NUL
) else (
rem Merge this file with previous one
set "comma=!comma!,"
move /Y result.csv result.in > NUL
rem Read lines of previous file from Stdin
< result.in (
rem ... and combine they with this file
for /F "usebackq delims=" %%l in ("%%f") do (
set "line=!comma:~1!"
set /P "line="
echo !line!,%%l
)
rem If previous file is longer than this one, copy the rest of lines
for /F "delims=" %%l in ('findstr "^"') do echo %%l,
rem Combine previous output in new result file
) > result.csv
)
)
del result.in
@echo关闭
setlocal EnableDelayedExpansion
rem设置批处理文件所在的当前目录
cd“%~P0”
设置“逗号=”
del result.csv 2>NUL
对于(*.txt)中的%%f,请执行以下操作(
rem,如果这是第一个文件
如果不存在,则返回result.csv(
雷姆,复制一下
复制“%%f”result.csv>NUL
)否则(
rem将此文件与上一个文件合并
设置“逗号=!逗号!,”
移动/Y result.csv result.in>NUL
rem从Stdin读取上一个文件的行
result.csv
)
)
del result.in
你说的“自己的专栏”是什么意思?你的意思是如果你有3个文件,每个文件有10列,你的输出文件将包含30列吗?请发布一个示例每个文本文件都是一列我基本上想把这些文件放在一起,这样输出文件将是3列。最后一个文件没有,它是文件中的最后一行,但这正是我所需要的。我感谢您的回复并感谢您的帮助。新创建的文件的最后一行打印11111111111111:22222222222222 1:33333333333333333这也会发生在您身上吗?不。我假设您的文件在每一行上都是#1111,
#2:222,
每行,#3:333
每行。最后一行输入有什么不寻常的地方吗?所有3个文件的行数是否相同?对我来说工作得很好…好的,解决了这个问题一对文件有不同的行数,我的下一个问题是源目录不总是相同的,因为不同的用户将在执行脚本时登录,有没有其他方法可以在不设置目录的情况下专门调用文件?当然可以。将findstr
中的%sourcedir%\%%f
更改为“%%f”
,并指定文件名及其完整路径。如果完整文件名包含空格,则“引用完整名称”。引用不包含空格的完整文件名不是必需的,但不会造成任何伤害。如果需要,该列表可以在多行上继续。还有其他可能导致问题的文件名字符,如)&代码>-引用这样的文件名应该可以解决这些问题