我希望使用批处理脚本将目录中的所有CSV/TXT文件合并在一起,并希望你们能够帮助 - 对于脚本编程来说很新颖,所以请原谅我,如果我要求解释每条线都做什么, 但是我确实发现了一些有用的东西,但是在测试时它仍然保持一个标题行。我希望它会合并所有文件 - 没有标题。使用批处理合并不带任何头文件的CSV文件
供参考:
@echo off
setlocal enableextensions disabledelayedexpansion
rem configure paths
set "source=C:\Users\Khalid\Desktop\New_folder\p*.csv"
set "target=C:\Users\Khalid\Desktop\newfile.csv"
rem remove output file if needed
if exist "%target%" del "%target%" >nul 2>nul
rem search for header row
set "headerRow="
for %%f in ("%source%") do (
<"%%~ff" (for /l %%a in (1 1 10) do if not defined headerRow set /p
"headerRow=")
if defined headerRow goto haveHeader
)
:haveHeader
if not defined headerRow (
echo ERROR: impossible to get header row.
goto endProcess
)
rem output header to header file to use as filter.
rem header is cut to avoid findstr limitations on search strings
set "headerFile=%temp%\%~nx0_headerFile.tmp"
setlocal enableextensions enabledelayedexpansion
> "%headerFile%" echo(!headerRow:~0,125!
endlocal
rem search for input files with matching headers to join to final file
for /f "tokens=*" %%f in ('findstr /m /b /l /g:"%headerFile%" "%source%"') do (
if not exist "%target%" (
rem first file is directly copied
copy "%%~f" "%target%" /y > nul 2>nul
) else (
rem next files are filtered to exclude the header row
findstr /v /b /l /g:"%headerFile%" "%%~f" >> "%target%"
)
echo ... [%%~ff] joined to %target%
)
rem remove the temporary header file
del "%headerFile%" >nul 2>nul
:endProcess
endlocal
第二个工作对我来说更好,因为脚本将需要阅读超过1021个字符的文件。不过你说这是set/p的限制,为什么它还用在第二个脚本中?也感谢你的这个解决方案,并感谢你的其他人的输入,非常感谢 –
@KhalidSheikh,限制不涉及文件大小,但行长。在第二个示例中,它用于至少检索标题行的开头,稍后将用作行匹配的非匹配开始行来放弃整行。 –
非常感谢您对整个答案的解释 –