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

[文本处理] [已解决]批处理怎么提取csv文件中的单元格汇总到一个新的表格里啊?

一个文件夹下有一堆CSV文件,怎么才能提取每个csv文件中的一个单元格,合并汇总到一个新的表格里啊;
比如附件1.csv 里 我想提取当前文件夹下所有csv文件 D37 的内容 到新表里,怎么实现啊,求大神指教
        Lot Start Time        2011-5-4        4:48:22                               
Lot End Time                2011-5-4        5:12:12                               
Cassette ID                1AC-0999                                       
Lot ID                1AGX140551                                       
Port No.                3                                       
                                                       
Processed Substrate                20                                       
Total Processed Substrate                349000                                       
                                                       
Sub. No.                3001                                       
Cassette Slot No.                1                                       
Process Recipe                A-ITO400A                                       
Platen Used                Platen1                                       
Recipe Type                SMD-Product                                       
SetUp Recipe                A-ITO SETUP                                       
                                                       
                Step1                Step2                Step3       
Recipe1                A-ITO 400A        ( S3 )                               
                                                       
L1 Chamber In                                                       
L1 Waiting Time of Loading        [sec]        0                                77       
L1 Heat temp        [C]                24        23        26        24       
L1 Heating Program No..        [no.]                                        1       
L1 Keeping Program No..        [no.]                                        1       
                                                       
Chamber                S3(CA32)                                       
        Units        Set        Ave        Min        Max        Act       
Process Start                2011-5-4        4:50:57                               
Process End                2011-5-4        4:51:07                               
S3 CA32 Platen Pos.        [Pos.]                                        0       
S3 CA32 Process Time        [sec]        999                        12               
S3 CA32 Sputter Time        [sec]        11                        10               
S3 MFC1 Ar        [sccm]        280        281        281        281               
S3 MFC2 O2        [sccm]        0        0        0        0               
S3 MFC3 H2O        [sccm]        3        3        3        3               
S3 DG Pressure        [Pa]                0.65        0.63        0.66               
S3 CA32 DC Power1        [kW]        60        60        59.9        60               
S3 CA32 DC Current1        [A]                145        143        146               
S3 CA32 DC Voltage1        [V]                413        409        420               
S3 CA32 Arc count1        [Times]                                        6       
S3 CA32 Target Life(1)        [kWh]                                        8975
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

回复 49# haichuan5121


    代码没有做容错处理,如果输入的行数或列数大于csv文件本身的行数或列数,就会报“下标越界”

解决办法:在vbs代码开头插入一行:
  1. On Error Resume Next
复制代码

TOP

Apang 大神 在不,帮忙看下 我的VB这个代码用的好好的,最近也没改啥咋用不了了啊! 提示

TOP

回复 45# apang


    Sorry  大哥对不住啊! 我一直以为你写得代码是BAT格式的呢,原来是VBS的。。。可以了

TOP

回复 45# apang


    你的40楼是正确的,问题解决了,一直以为是BAT代码呢 不知道是VBS的  改个后缀就能刷了 。。

TOP

回复 44# haichuan5121
你用40楼的代码,很快的,几百个文件也不会超过10秒吧。
我是写着玩的,哪晓得你要那么多文件。根本就不考虑效率。
你把40楼的代码的文件名改成vbs结尾,不要用bat结尾。主要是你没把用途写清楚,一直都在变。别人当然就不考虑那么多了。
1

评分人数

TOP

除非单个文件几百兆上G级,否则不可能“刷一个要50分钟”。
如此,你应该在顶楼就交代清楚
顶楼不说清楚,一会想实现这样一会又想那样,什么心态?“我是小白”很了不起吗?
给你代码不会用,活该你慢。

TOP

回复 39# apang


    你这个数据少能刷;我这个文件有200-500个文件 刷一个要50分钟。。。。。

TOP

回复 40# apang


    运行没反应啊  我小白 也看不懂

TOP

回复 38# yiwuyun


    大神NB啊 成了 ,就是小白用着有点蒙圈;能不能改成 输入 单元格刷数据的啊,比如 提示输入C2 .D8. F20 就可以刷这三位置的数据啊?
或者跟19楼似得刷取过程有个提示的。

TOP

  1. @echo off
  2. setlocal EnableDelayedExpansion
  3. set /a rowStart=37
  4. set /a rowEnd=39
  5. set /a colNumber=4
  6. set "fileSeperator=,"
  7. set "fileType=csv"
  8. if "!fileType!"=="csv" (
  9.   set "allFile=*.csv"
  10. ) else (
  11.   set "allFile=*.txt"
  12. )
  13. if "!fileSeperator!"=="," (
  14.   set outputFile=new.csv
  15. ) else (
  16.   set outputFile=new.txt
  17. )
  18. set /a fileCount=!rowEnd!-!rowStart!+1
  19. for /l %%a in (!rowStart!,1,!rowEnd!) do (
  20.   set /a fileNumber=%%a-!rowStart!+1
  21.   set /a skip=0
  22.   for /f "delims=" %%b in ('dir /b !allFile!') do (
  23.      for /f "tokens=%colNumber% delims=," %%c in ('type %%b') do (
  24.        set /a skip+=1
  25.        if "!skip!"=="%%a" (
  26.          echo %%c>>file!fileNumber!.txt
  27.        )
  28.      )
  29.      set /a skip=0
  30.   )
  31. )
  32. set /a n=!fileCount!
  33. set /a m=0
  34. set str=
  35. type nul>!outputFile!
  36. for /l %%a in (1,1,!n!) do (
  37.   set /a n1=0
  38.   for /f %%b in ('type file%%a.txt') do (
  39.     set /a n1+=1
  40.     for /l %%c in (!n1!,1,!n1!) do (
  41.        set file%%a.row%%c=%%b
  42.     )
  43.   )
  44.   if !n1! gtr !m! (set /a m=!n1!)
  45. )
  46. for /l %%a in (1,1,!m!) do (
  47.   for /l %%b in (1,1,!n!) do (
  48.     if "!file%%b.row%%a!"=="" (set /a file%%b.row%%a=0)
  49.     if "%%b"=="!n!" (
  50.       set "str=!str!!file%%b.row%%a!"
  51.     ) else (
  52.        if "!fileSeperator!"=="," (
  53.          set "str=!str!!file%%b.row%%a!,"
  54.        ) else (
  55.          set "str=!str!!file%%b.row%%a!    "
  56.        )
  57.     )
  58.   )
  59.   echo !str!>>!outputFile!
  60.   set str=
  61. )
  62. for /l %%a in (1,1,!fileCount!) do (
  63.   if exist ".\file%%a.txt" del ".\file%%a.txt"
  64. )
复制代码
这个稍稍通用一点

TOP

再来一下:
  1. arrCell = Array("D37", "D38", "D39") ''需要提取的单元格
  2. Set fso = CreateObject("Scripting.FileSystemObject")
  3. For Each file in fso.GetFolder(".").Files
  4.         If LCase(Right(file, 4)) = ".csv" Then
  5.                 Set f = fso.OpenTextFile(file, 1)
  6.                 txt = f.ReadAll : f.Close
  7.                 str = str & getCellsData(txt) & vbCrLf
  8.         End If
  9. Next
  10. fso.OpenTextFile("new.csv", 2, true).Write str
  11. MsgBox "OK"
  12. Function getCellsData(ByVal txt)
  13.         '' csv文本分割成数组
  14.         arrTxt = Split(txt, vbCrLf)
  15.         strChr = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  16.         ''建立正则表达式
  17.         Set re = New RegExp
  18.         ''正则表达式模式,最大支持到ZZ列
  19.         re.Pattern = "^([a-z]{1,2})(\d+)$"
  20.         re.IgnoreCase = true
  21.         For i = 0 to UBound(arrCell)
  22.                 n = re.Execute(arrCell(i))(0).SubMatches(0)
  23.                 n = UCase(Right("0" & n, 2))
  24.                 n1 = InStr(strChr, Left(n, 1))
  25.                 n2 = InStr(strChr, Mid(n, 2))
  26.                 n = n1 * 26 + n2 - 1
  27.                 m = re.Execute(arrCell(i))(0).SubMatches(1) - 1
  28.                 s = s & "," & Split(arrTxt(m), ",")(n)
  29.         Next
  30.         getCellsData = Mid(s, 2)
  31. End Function
复制代码

TOP

也来一个:
  1. @set @n=0;/* & echo off
  2. set "cell=D37 D38 D39"
  3. for %%a in (*.csv) do (
  4.         cscript -nologo -e:jscript "%~0"<"%%a">>$ "%cell%"
  5. )
  6. move $ new.csv
  7. pause & exit & */
  8. arg = WScript.Arguments(0).split(" ");
  9. txt = WScript.StdIn.ReadAll();
  10. arTxt = txt.replace(/(\s*\n)+$/, "").split("\r\n");
  11. chr = "0ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  12. arCell = [];
  13. for (i=0; i<arg.length; i++) {
  14.         m = arg[i].match(/\d+$/)[0] - 1;
  15.         n = ("0" + arg[i]).match(/(..)\d+$/)[1].toUpperCase();
  16.         n1 = chr.indexOf(n.substr(0, 1));
  17.         n2 = chr.indexOf(n.substr(1));
  18.         n = n1 * 26 + n2 - 1;
  19.         arCell.push(arTxt[m].split(",")[n]);
  20. }
  21. WScript.Echo(arCell.join(","))
复制代码
1

评分人数

TOP

  1. @echo off
  2. setlocal EnableDelayedExpansion
  3. set /a start=36
  4. for /l %%a in (37,1,39) do (
  5.   set /a fileNumber=%%a-!start!
  6.   set /a skip=0
  7.   for /f "delims=" %%b in ('dir /b *.csv') do (
  8.      for /f "tokens=4 delims=," %%c in ('type %%b') do (
  9.        set /a skip+=1
  10.        if "!skip!"=="%%a" (
  11.          echo %%c>>file!fileNumber!.txt
  12.        )
  13.      )
  14.      set /a skip=0
  15.   )
  16. )
  17. set /a n=3
  18. set /a m=0
  19. set str=
  20. type nul>new.csv
  21. for /l %%a in (1,1,!n!) do (
  22.   set /a n1=0
  23.   for /f %%b in ('type file%%a.txt') do (
  24.     set /a n1+=1
  25.     for /l %%c in (!n1!,1,!n1!) do (
  26.        set file%%a.row%%c=%%b
  27.     )
  28.   )
  29.   if !n1! gtr !m! (set /a m=!n1!)
  30. )
  31. for /l %%a in (1,1,!m!) do (
  32.   for /l %%b in (1,1,!n!) do (
  33.     if "!file%%b.row%%a!"=="" (set /a file%%b.row%%a=0)
  34.     if "%%b"=="!n!" (
  35.       set "str=!str!!file%%b.row%%a!"
  36.     ) else (
  37.       set "str=!str!!file%%b.row%%a!,"
  38.     )
  39.   )
  40.   echo !str!>>new.csv
  41.   set str=
  42. )
复制代码
逗号分隔

TOP

  1. @echo off
  2. setlocal EnableDelayedExpansion
  3. set /a start=36
  4. for /l %%a in (37,1,39) do (
  5.   set /a fileNumber=%%a-!start!
  6.   set /a skip=0
  7.   for /f "delims=" %%b in ('dir /b *.csv') do (
  8.      for /f "tokens=4 delims=," %%c in ('type %%b') do (
  9.        set /a skip+=1
  10.        if "!skip!"=="%%a" (
  11.          echo %%c>>file!fileNumber!.txt
  12.        )
  13.      )
  14.      set /a skip=0
  15.   )
  16. )
  17. set /a n=3
  18. set /a m=0
  19. set str=
  20. type nul>new.csv
  21. for /l %%a in (1,1,!n!) do (
  22.   set /a n1=0
  23.   for /f %%b in ('type file%%a.txt') do (
  24.     set /a n1+=1
  25.     for /l %%c in (!n1!,1,!n1!) do (
  26.        set file%%a.row%%c=%%b
  27.     )
  28.   )
  29.   if !n1! gtr !m! (set /a m=!n1!)
  30. )
  31. for /l %%a in (1,1,!m!) do (
  32.   for /l %%b in (1,1,!n!) do (
  33.     if "!file%%b.row%%a!"=="" (set /a file%%b.row%%a=0)
  34.     set "str=!str!!file%%b.row%%a!   "
  35.   )
  36.   echo !str!>>new.csv
  37.   set str=
  38. )
复制代码

TOP

返回列表