Board logo

标题: [文件操作] 批处理如何将所有子文件夹下的csv文件合并成一个csv,请指教,谢谢! [打印本页]

作者: xslxslxsl    时间: 2023-8-24 14:30     标题: 批处理如何将所有子文件夹下的csv文件合并成一个csv,请指教,谢谢!

如何将某个文件夹下所有子文件夹下的csv文件(会有重复文件名)合并成一个csv,请指教,谢谢!
作者: wanghan519    时间: 2023-8-24 14:57

本帖最后由 wanghan519 于 2023-8-24 17:03 编辑

兄弟,缘分啊,powershell确实很方便了
dir -Recurse *.csv | cat > out.csv
要不就用busybox打包一句
find . -iname '*.csv' -exec sed '' {} > out.csv +

好处是不管文件结尾是否有换行结果都正常
作者: qixiaobin0715    时间: 2023-8-24 15:00

  1. @echo off
  2. (for /f "tokens=1* delims=:" %%i in ('findstr /s .* *.csv') do echo,%%j)>New.csv
复制代码

作者: 77七    时间: 2023-8-24 15:01

本帖最后由 77七 于 2023-8-24 15:12 编辑
  1. @echo off
  2. (for /d %%d in (*) do (
  3. for /r %%i in ("%%d\*.csv") do type "%%i"
  4. ))>new.csv
  5. pause
复制代码

作者: buyiyang    时间: 2023-8-24 15:43

  1. @echo off
  2. for /d %%i in (*) do (
  3.     pushd "%%i"
  4.     copy /b *.csv "..\%%~nxi.cs"
  5.     popd
  6.     )
  7. copy /b *.cs new.csv
  8. pause
复制代码

作者: Five66    时间: 2023-8-24 16:49

合并后的文件名为:the_new_new_csv.csv
所有scv都必须以换行符结尾,不然合并后会两行凑在一起
  1. @echo off
  2. cd.>the_new_new_csv.csv
  3. for /r /d %%i in (*) do (
  4. type "%%i\*.csv" >>the_new_new_csv.csv 2>nul
  5. )
复制代码

作者: xslxslxsl    时间: 2023-8-24 17:07

回复 2# wanghan519


    powershell都不懂 ,不过还是要谢谢你!
作者: aloha20200628    时间: 2023-8-24 20:49


合为一总有一个顺序吧...按名称/时间...还有升序和降序...
也许加载 dir 排序参数 /o? 会更有帮助。
  1. (for /f "delims=" %F in ('dir /b/s/a-d *.csv') do type "%~F")>"allInOne.csv"
复制代码

作者: hlzj88    时间: 2023-8-24 21:10

type “*.csv”>>aaa.txt
ren aaa.txt aaa.csv
这个可以吗
作者: Nsqs    时间: 2023-8-24 21:15

这样合并的不是标准的csv,只有wps能打开,office打开一般会提示格式错误
作者: 77七    时间: 2023-8-25 07:33

本帖最后由 77七 于 2023-8-25 07:48 编辑

昨天我在测试的时候就发现了一点问题,现在归纳一下
  1. @echo off
  2. rem 生成测试文件1.txt 2.txt
  3. >1.txt echo 1
  4. >2.txt echo 2
  5. exit
  6. rem code1
  7. @echo off
  8. for /f "delims=" %%i in ('dir /b /a-d *.txt') do type "%%i">>new1.txt
  9. exit
  10. rem code2
  11. @echo off
  12. (for /f "delims=" %%i in ('dir /b /a-d *.txt') do type "%%i")>new2.txt
  13. exit
  14. rem code3
  15. rem 命令行直接执行
  16. for /f "delims=" %i in ('dir /b /a-d *.txt') do type "%i">>new3.txt
  17. rem code4
  18. rem 命令行直接执行
  19. (for /f "delims=" %i in ('dir /b /a-d *.txt') do type "%i")>new4.txt
复制代码


不考虑结尾换行符情况。
以上4段代码,代码1和3能得到正确结果。代码2和4不能得到正确结果。
我才发现dir 还有这个问题需要注意。
作者: qixiaobin0715    时间: 2023-8-25 09:11

回复 11# 77七
要使用type命令可以这么用:
  1. (for /f %%i in ('type *.txt 2^>nul') do echo,%%i)>a.txt
复制代码

作者: qixiaobin0715    时间: 2023-8-25 10:04

回复 11# 77七
输出结果用.log或.temp格式,与要处理的文件扩展名不相同就不会出问题。
作者: 77七    时间: 2023-8-25 10:49

回复 13# qixiaobin0715


   
谢谢大佬指点!
过滤下dir的结果应该也行,但是涉及子目录或者文件名有包含被包含的,也有些麻烦,生成一个不同的扩展名可能是最省心的了。
以前发现type *.txt > 3.txt
的结果和文件名”排序“有关,可能和11楼的代码2一个“原理”。

  1. @echo off
  2. rem 生成测试文件1.txt 2.txt
  3. >1.txt echo 1
  4. >2.txt echo 2
  5. exit
  6. rem code1
  7. @echo off
  8. (for /f "delims=" %%i in ('dir /b /a-d *.txt') do type "%%i")>0.txt
  9. exit
  10. rem code2
  11. @echo off
  12. (for /f "delims=" %%i in ('dir /b /a-d *.txt') do type "%%i")>3.txt
  13. exit
复制代码


像以上代码,代码1 生成的文件名 为 0.txt  “排序” 在 1.txt 2.txt 前,结果也是正确的;代码2 文件名3.txt结果则不正确。
代码1、2 分别和 type *.txt >0.txt type *.txt >3.txt 结果相同。
作者: Five66    时间: 2023-8-25 17:42

回复 14# 77七

这是重定向位置问题吧
比如:type *.txt > 3.txt
先执行 > 3.txt 产生了一个3.txt
再执行type *.txt ,由于之前产生了3.txt,星号(*)通配时将3.txt通配进去了
因为多了个3.txt导致结果可能不正确
作者: 77七    时间: 2023-8-25 19:22

本帖最后由 77七 于 2023-8-25 19:32 编辑

回复 15# Five66


大概和 for /r 有点类似。




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2