找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 62820|回复: 15

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

[复制链接]
发表于 2023-8-24 14:30:57 | 显示全部楼层 |阅读模式
如何将某个文件夹下所有子文件夹下的csv文件(会有重复文件名)合并成一个csv,请指教,谢谢!
发表于 2023-8-24 14:57:18 | 显示全部楼层
本帖最后由 wanghan519 于 2023-8-24 17:03 编辑

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

好处是不管文件结尾是否有换行结果都正常
发表于 2023-8-24 15:00:03 | 显示全部楼层
  1. @echo off
  2. (for /f "tokens=1* delims=:" %%i in ('findstr /s .* *.csv') do echo,%%j)>New.csv
复制代码
发表于 2023-8-24 15:01:44 | 显示全部楼层
本帖最后由 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
复制代码
发表于 2023-8-24 15:43:18 | 显示全部楼层
  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
复制代码
发表于 2023-8-24 16:49:21 | 显示全部楼层
合并后的文件名为: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. )
复制代码
 楼主| 发表于 2023-8-24 17:07:44 | 显示全部楼层
回复 2# wanghan519


    powershell都不懂 ,不过还是要谢谢你!
发表于 2023-8-24 20:49:31 | 显示全部楼层

合为一总有一个顺序吧...按名称/时间...还有升序和降序...
也许加载 dir 排序参数 /o? 会更有帮助。

  1. (for /f "delims=" %F in ('dir /b/s/a-d *.csv') do type "%~F")>"allInOne.csv"
复制代码
发表于 2023-8-24 21:10:29 | 显示全部楼层
type “*.csv”>>aaa.txt
ren aaa.txt aaa.csv
这个可以吗
发表于 2023-8-24 21:15:27 | 显示全部楼层
这样合并的不是标准的csv,只有wps能打开,office打开一般会提示格式错误
发表于 2023-8-25 07:33:50 | 显示全部楼层
本帖最后由 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 还有这个问题需要注意。

评分

参与人数 1技术 +1 收起 理由
qixiaobin0715 + 1 以前不知道,谢谢分享

查看全部评分

发表于 2023-8-25 09:11:05 | 显示全部楼层
回复 11# 77七
要使用type命令可以这么用:
  1. (for /f %%i in ('type *.txt 2^>nul') do echo,%%i)>a.txt
复制代码
发表于 2023-8-25 10:04:31 | 显示全部楼层
回复 11# 77七
输出结果用.log或.temp格式,与要处理的文件扩展名不相同就不会出问题。
发表于 2023-8-25 10:49:09 | 显示全部楼层
回复 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 结果相同。
发表于 2023-8-25 17:42:38 | 显示全部楼层
回复 14# 77七

这是重定向位置问题吧
比如:type *.txt > 3.txt
先执行 > 3.txt 产生了一个3.txt
再执行type *.txt ,由于之前产生了3.txt,星号(*)通配时将3.txt通配进去了
因为多了个3.txt导致结果可能不正确
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-18 15:37 , Processed in 0.022215 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表