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

[文本处理] [已解决]批处理如何将多个文本按相同名称合并为单文本?

在我的电脑“f”盘下“zhubi”文件夹内有名称为以下的,共计260个文本
内盘1.txt..............内盘31.txt
外盘1.txt..............外盘31.txt
内盘笔1.txt..............内盘笔31.txt
外盘笔1.txt..............外盘笔31.txt
委买1.txt..............委买31.txt
委卖1.txt..............委卖31.txt
委买笔1.txt..............委买笔31.txt
委卖笔1.txt..............委卖笔31.txt
内盘成交笔数.txt
内盘成交量.txt
内盘单笔最大成交量.txt
外盘成交笔数.txt
外盘成交量.txt
外盘单笔最大成交量.txt
委托买入总量.txt
委买总笔.txt
委买单笔最大成交量.txt
委托卖出总量.txt
委卖总笔.txt
委卖单笔最大成交量.txt
所有文本格式都一样,如以下,第一列为名称,第二列为日期,第三列为数值(所有第一列名称和第二列日期都一样,只有第三列数值不同)
SH600004 2010-04-28 37381
SH600005 2010-04-28 101010
SH600006 2010-04-28 36716
SH600007 2010-04-28 16350
SH600008 2010-04-28 45580
SH600009 2010-04-28 162257
SH600010 2010-04-28 83726
SH600011 2010-04-28 21314
SH600012 2010-04-28 67743
SH600016 2010-04-28 0
SH600017 2010-04-28 86413
SH600018 2010-04-28 55453
SH600019 2010-04-28 102978
SH600020 2010-04-28 25946
SH600021 2010-04-28 28294
SH600022 2010-04-28 53404
SH600026 2010-04-28 38750
SH600027 2010-04-28 0
SH600028 2010-04-28 197883
我想将这260个文件按第一列的名称合并成一个文件,我每天都用excel做同样的工作,太繁琐了,我想做个批处理,合并后文件格式如下(每列数值前为原始文本名称)
名称        日期    内盘1    内盘2   内盘3  内盘4.................
SH600004 2010-04-28 37381    16350    16350  16350.................
SH600005 2010-04-28 101010    5650    66350   350................
SH600006 2010-04-28 36716    5350    46350  616350................

[ 本帖最后由 w96692 于 2010-4-30 10:24 编辑 ]
1

评分人数

    • namejm: 感谢主动给标题标注[已解决]字样PB + 2

是否按楼主在1楼提供的文本顺序进行合并?

以下批处理的文本处理顺序是按楼主提供的列表顺序进行:
  1. @echo off&setlocal enabledelayedexpansion
  2. set "a= "
  3. set "han=F:\zhubi\"
  4. set "ye=F:\zhubi\合并%date%.txt"
  5. set "gu=内盘成交笔数 内盘成交量 内盘单笔最大成交量 外盘成交笔数 外盘成交量 外盘单笔最大成交量 委托买入总量 委买总笔 委买单笔最大成交量 委托卖出总量 委卖总笔 委卖单笔最大成交量"
  6. for %%a in (内盘 外盘 内盘笔 外盘笔 委买 委卖 委买笔 委卖笔) do for /l %%b in (1,1,31) do call:xing "%%a%%b"
  7. for %%a in (%gu%) do call:xing "%%a"
  8. echo.开始合并到文本"%ye%"
  9. >"%ye%" echo.名称%a%日期!xing!
  10. for /f "usebackq tokens=1,2" %%a in ("%han%内盘1.txt") do >>"%ye%" echo.%%a%a%%%b!#%%a!
  11. echo.操作已完成&pause&exit
  12. :xing
  13. set "xing=!xing!%a%%~1"
  14. set "b=%han%%~1.txt"
  15. echo.正在预处理%b%...
  16. for /f "usebackq tokens=1,3" %%a in ("%b%") do set "#%%a=!#%%a!%a%%%b"
复制代码
说明:
本批处理正常运行可能受到此限制:最大单个环境变量大小为 8192 字节。所有变量的最大环境变量的总和大小(包括变量名和等号)为 65,536 KB。
变量a设置制表符为值,即set "a= "中的等号后面不是空格,是一个制表符
变量han设置文本所在目录路径,允许该路径存在空格。
变量ye设置合并后文本的路径和文件名。最后合并的文本名例如为“F:\zhubi\合并2010-04-29 星期四.txt”。
变量gu设置不循环的文本。

[ 本帖最后由 hanyeguxing 于 2010-4-30 00:10 编辑 ]
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

原帖由 hanyeguxing 于 2010-4-29 17:27 发表
是否按楼主在1楼提供的文本顺序进行合并?

以下批处理的文本处理顺序是按楼主提供的列表顺序进行:@echo off&setlocal enabledelayedexpansion
set "a= "
set "han=F:\zhubi\"
set "ye=F:\zhubi\合并%date%.tx ...

顺序就按我给出的就行(1-31)那样排列,无序号的文本放在末尾。
首先感谢您的帮助,可是不知为什么,运行代码后无任何反映(只出了一个黑框,无任何内容显示),也没有合并文件。

TOP

copy /b *.txt  a.txt 可以把这些文本里的所有内容合并到a.txt,但是好象前缀都一样啊。比如:
内盘笔4
SH600000        2010-04-29        1935
SH600004        2010-04-29        324
SH600005        2010-04-29        1020
SH600007        2010-04-29        65
SH600008        2010-04-29        443
SH600009        2010-04-29        1907
SH600010        2010-04-29        676
SH600011        2010-04-29        156
委买1
SH600000        2010-04-29        265273
SH600004        2010-04-29        35524
SH600005        2010-04-29        142144
SH600007        2010-04-29        9673
SH600008        2010-04-29        47285
SH600009        2010-04-29        238261
SH600010        2010-04-29        129699
SH600011        2010-04-29        18959

关键是第3列要怎么弄?
努力学习,努力挣分

TOP

测试2楼的代码没有问题:
1,由于原先未加入进度显示,造成缺乏实时显示状态。针对这个问题,已对2楼代码进行修改。
2,随着变量的处理量变大,速度会越来越慢。实际测试,完成整个操作需要24分50秒。
3,优点是不使用临时文件。
4,按指定的文本顺序进行处理。

[ 本帖最后由 hanyeguxing 于 2010-4-30 00:50 编辑 ]
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

  看了楼主的描述,楼主的需求似乎是这样的:
  1、有260个文本文件,每个文件有3列数据;
  2、在这些文本文件中,每个文件对应行上的第1列和第2列数据相同;
  3、需要把这260个文件中的所有数据都汇总到一个文件中,从第3列起,每列字段以文件名作为字段名,以对应行上第3列的数据作为相应列字段的数据加以保存;
  4、第3列起的列字段顺序,以文件名中1~31的升序排列,文件名前缀相同的放一块,没有相同前缀的放后面;

  如果我这个描述准确、完整地归纳了楼主的意思的话,可以使用下面的代码生成中间数据,然后导入excel中加以处理:
  1. @echo off
  2. set t=%time%
  3. (
  4. set /p=名称 日期<nul
  5. for %%i in (*.txt) do set /p =%%~ni<nul
  6. echo.
  7. for /f "tokens=1,2" %%i in (委买1.txt) do (
  8.     echo 正在处理 %%i>con
  9.     set /p=%%i %%j<nul
  10.     for /f "tokens=3" %%x in ('findstr /bc:"%%i" *.txt') do set /p=%%x<nul
  11.     echo.
  12. )
  13. echo.
  14. )>result
  15. start notepad.exe result
  16. cls
  17. echo 处理完毕
  18. echo %t%
  19. echo %time%
  20. pause
复制代码
  以上代码需放在F盘Zhubi目录下运行,思路是:

  1、用 for 语句读取当前目录下的所有 txt 文件名,生成行标题;
  2、根据 委买1.txt 文件里第1列的数据,在所有txt文件中查找以 委买1.txt 文件中第1列数据打头的对应行上第3列的数据,拼接起来,作为新行保存。只要保证每个文件对应行上的第1列和第2列绝对相同,没有丝毫错位,则 委买1.txt 可以换成任意一个存在的文本文件名,实际上,这也是本代码能够实现楼主意图的前提。

  通过以上代码,生成的数据保存在名为result的文本文件中,每列数据以空格分隔。考虑到批处理中每行能处理的最大字节数有限制(约为8192字节),所以每列数据以单个空格分隔,这样,假设每列数值在10字符以内,则每个数值行的长度约为(262*10+261)字节,而标题行的字符数可能是数值行长度的1.5倍,单行数据长度不会超限。

  需要注意的是,数据处理结果文件绝对不能保持为.txt后缀,否则,会导致重复统计。

  另外,当文件名的序号超过9的时候,最终结果的字段名不能完全按照1~31这样的升序排列,而是按照1,10~19,2,20~29,3,30,31这样的顺序排列,需要在excel中自行调整顺序。

  导入excel时,请以空格作为分隔符号切分文本。

  在本人机器上的测试结果,用楼主提供的12个文本,耗时3分钟左右,照此速度推测,260个文件约需1小时左右。本人机器配置为:主频1.6GHz、512M内存,SP3系统。
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

哦,明白你的意思了。不过楼上的代码已经够精简了,不继续丢人了
努力学习,努力挣分

TOP

首先感谢大家的帮助,我的求助本意是做个批处理不用每次都复制到文件夹执行,(日复一日也挺麻烦的),版主的很好,就是也需要复制到文件夹内,如果能指定目录就好了

[ 本帖最后由 w96692 于 2010-4-30 08:21 编辑 ]

TOP

回复 6楼 的帖子

用了您的代码,也很快处理完,但是也需要复制,如果能够不用复制就好了(我每天只处理f盘zhubi文件夹,这是固定的),谢谢您

[ 本帖最后由 w96692 于 2010-4-30 08:19 编辑 ]

TOP

能用excel完成的就用excel吧,效率不在同一个级别上...

TOP

  修改一下6楼的代码,使得批处理可以放在任意位置,但是要处理的目录除外(可以放在要处理目录的子目录下),并且,生成的结果保存在批处理文件当前目录下:
  1. @echo off
  2. set t=%time%
  3. set "olddir=%cd%"
  4. cd /d f:\zhubi
  5. (
  6. set /p=名称 日期<nul
  7. for %%i in ( *.txt) do set /p =%%~ni<nul
  8. echo.
  9. for /f "tokens=1,2" %%i in (委买1.txt) do (
  10.     echo 正在处理 %%i>con
  11.     set /p=%%i %%j<nul
  12.     for /f "tokens=3" %%x in ('findstr "%%i" *.txt') do set /p=%%x<nul
  13.     echo.
  14. )
  15. echo.
  16. )>"%olddir%\result.txt"
  17. start "" "%olddir%\result.txt"
  18. cls
  19. echo 处理完毕
  20. echo %t%
  21. echo %time%
  22. pause
复制代码
  再来一个略为提高速度的代码,但是需要生成临时文件,该代码的思路是先把所有文本合并到一个临时文件中,然后读取该临时文件的内容,从而避免读取多个文件,使得速度略有提升:
  1. @echo off
  2. set "olddir=%cd%"
  3. cd /d f:\zhubi
  4. set t=%time%
  5. cd.>"%olddir%\tmp.txt"
  6. for %%i in (*.txt) do (
  7.     call set str1=%%str1%%+%%i
  8.     call set str2=%%str2%% %%~ni
  9. )
  10. copy %str1:~1% "%olddir%\tmp.txt"
  11. echo 名称 日期 %str2%>"%olddir%\result.txt"
  12. cls
  13. (for /f "tokens=1,2" %%i in (委买1.txt) do (
  14.     echo 正在处理 %%i>con
  15.     set /p=%%i %%j<nul
  16.     for /f "tokens=3" %%x in ('findstr /ib "%%i" "%olddir%\tmp.txt"') do (
  17.         set /p=%%x<nul
  18.     )
  19.     echo.
  20. ))>>"%olddir%\result.txt"
  21. start "" "%olddir%\result.txt"
  22. cls
  23. echo 处理完毕
  24. echo %t%
  25. echo %time%
  26. pause
复制代码
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

原帖由 namejm 于 2010-4-30 10:03 发表
  修改一下6楼的代码,使得批处理可以放在任意位置,但是要处理的目录除外(可以放在要处理目录的子目录下),并且,生成的结果保存在批处理文件当前目录下:@echo off
set t=%time%
set "olddir=%cd%"
cd /d f ...
谢谢管理员,虽然比excel慢点,但省事了,我是又笨又懒啊,再次感谢

TOP

原帖由 more 于 2010-4-30 09:19 发表
能用excel完成的就用excel吧,效率不在同一个级别上...

是啊,excel处理所有文件也就20秒,批处理需要几分钟啊,但省事好多,谢谢大家!!!!

TOP

  用vba写一段excel宏应当能满足楼主的懒惰需求,可惜我不会写vba,不知有谁愿意尝试一下。
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

如果要做成Excel的话,本人愿意一试...否则用vbs,效率也比批处理高得多.

[ 本帖最后由 more 于 2010-5-2 07:34 编辑 ]

TOP

返回列表