[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

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

如何将某个文件夹下所有子文件夹下的csv文件(会有重复文件名)合并成一个csv,请指教,谢谢!

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

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

好处是不管文件结尾是否有换行结果都正常

TOP

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

TOP

本帖最后由 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
复制代码
bat小白,请多指教!谢谢!

TOP

  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
复制代码

TOP

合并后的文件名为: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. )
复制代码

TOP

回复 2# wanghan519


    powershell都不懂 ,不过还是要谢谢你!

TOP


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

TOP

type “*.csv”>>aaa.txt
ren aaa.txt aaa.csv
这个可以吗
目的,学习批处理

TOP

这样合并的不是标准的csv,只有wps能打开,office打开一般会提示格式错误

TOP

本帖最后由 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

评分人数

bat小白,请多指教!谢谢!

TOP

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

TOP

回复 11# 77七
输出结果用.log或.temp格式,与要处理的文件扩展名不相同就不会出问题。

TOP

回复 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 结果相同。
bat小白,请多指教!谢谢!

TOP

回复 14# 77七

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

TOP

返回列表