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

[文本处理] .bat解析TXT多行多列显示,并生成.csv

"VarName"        "TimeString"        "VarValue"        "Validity"        "Time_ms"
"data1"        "2018-11-24 22:14:21"        11.000000        1        43428926634.120369
"data2"        "2018-11-24 22:14:21"        12.000000        1        43428926634.120369
"data3"        "2018-11-24 22:14:21"        13.000000        1        43428926634.120369
"data4"        "2018-11-24 22:14:21"        14.000000        1        43428926634.120369
"data5"        "2018-11-24 22:14:21"        15.000000        1        43428926634.120369
"data6"        "2018-11-24 22:14:21"        16.000000        1        43428926634.120369
"data7"        "2018-11-24 22:14:21"        17.000000        1        43428926634.120369
"data8"        "2018-11-24 22:14:21"        18.000000        1        43428926634.120369
"data1"        "2018-11-24 22:14:52"        21.000000        1        43428926998.761574
"data2"        "2018-11-24 22:14:52"        22.000000        1        43428926998.773148
"data3"        "2018-11-24 22:14:52"        23.000000        1        43428926998.773148
"data4"        "2018-11-24 22:14:52"        24.000000        1        43428926998.773148
"data5"        "2018-11-24 22:14:52"        25.000000        1        43428926998.773148
"data6"        "2018-11-24 22:14:52"        26.000000        1        43428926998.773148
"data7"        "2018-11-24 22:14:52"        27.000000        1        43428926998.773148
"data8"        "2018-11-24 22:14:52"        28.000000        1        43428926998.773148
"data1"        "2018-11-24 22:15:20"        30.000000        1        43428927324.918976
"data2"        "2018-11-24 22:15:20"        31.000000        1        43428927324.918976
"data3"        "2018-11-24 22:15:20"        32.000000        1        43428927324.918976
"data4"        "2018-11-24 22:15:20"        33.000000        1        43428927324.918976
"data5"        "2018-11-24 22:15:20"        34.000000        1        43428927324.918976
"data6"        "2018-11-24 22:15:20"        35.000000        1        43428927324.918976
"data7"        "2018-11-24 22:15:20"        36.000000        1        43428927324.918976
"data8"        "2018-11-24 22:15:20"        37.000000        1        43428927324.918976
"data1"        "2018-11-24 22:15:49"        41.000000        1        43428927661.435181
"data2"        "2018-11-24 22:15:49"        42.000000        1        43428927661.435181
"data3"        "2018-11-24 22:15:49"        43.000000        1        43428927661.435181
"data4"        "2018-11-24 22:15:49"        44.000000        1        43428927661.435181
"data5"        "2018-11-24 22:15:49"        45.000000        1        43428927661.435181
"data6"        "2018-11-24 22:15:49"        46.000000        1        43428927661.435181
"data7"        "2018-11-24 22:15:49"        47.000000        1        43428927661.435181
"data8"        "2018-11-24 22:15:49"        48.000000        1        43428927661.435181
"$RT_OFF$"        "2018-11-24 22:15:53"        0        2        43428927698.993057
"$RT_COUNT$"        33                       

以上内容为TXT  如何通过.bat解析,并让其8行8列数据显示(显示如下,依次循环),并生成csv
data1        data2        data3        data4        data5        data6        data7        data8        time
11        12        13        14        15        16        17        18        2018/11/24 22:14
21            22           23            24           25            26            27           28           2018/11/24 22:14

不是最佳效率。
  1. @echo off & cd /d "%~dp0"
  2. setlocal EnableDelayedExpansion
  3. echo data1 data2 data3 data4 data5 data6 data7 data8 time
  4. for /f "tokens=1-4 delims= " %%a in (ref.txt) do (
  5. set "n1=%%a" & set "n2=%%b" & set "n3=%%c" & set "n4=%%d"
  6. set "n2=!n2:-=/!"
  7. echo %%a|findstr /i "data[1-8]">nul && (
  8. set "VarValue=!VarValue! !n4:.000000=!"
  9. if /i "!n1:~1,-1!"=="data8" (
  10. echo !VarValue:~1! !n2:~1! !n3:~0,-1!
  11. set "VarValue="
  12. )
  13. )
  14. )
  15. pause
复制代码
===若文件固定,改一下速度很快。自行添加重定向以输出到csv。EXCEL中导入并以TAB键分格。===

TOP

不是最佳效率。===若文件固定,改一下速度很快。自行添加重定向以输出到csv。EXCEL中导入并以TAB键分格。== ...
xczxczxcz 发表于 2018-11-25 14:01


非常感谢楼主,如每次解析的.txt文档,名字都为 ref.txt  解析完成,最后自动生成ref.csv这个代码怎么加呢?

TOP

使用gawk。
以下保存为script.awk
  1. BEGIN {printf("data1,data2,data3,data4,data5,data6,data7,data8,time\n")}
  2. /data/ {a[NR]=$4;b[NR]=substr($2,2,11);c[NR]=substr($3,1,5)}
  3. END{
  4. for(i=2;i<=NR-2;i++)
  5. {
  6. if((i-1)%8)
  7. printf("%-2d,",a[i]);
  8. else printf("%-2d,%s %s\n",a[i],b[i],c[i]);
  9. }
  10. }
复制代码
再bat或bash调用
  1. gawk -f 'script.awk' 1.txt >1.csv
复制代码

TOP

回复 3# shaohua

重定向应该会的。留着给你自添加,可以随意写。
   第 4 行 行尾加 ">ref.csv" 不要引号
   第 5 行 行首加 "(" 不要引号
   第 15 行 行尾加 ")>>ref.csv" 不要引号
=================================
如果为 WIN7 及以上系统用下面这个更好。
  1. @echo off & cd /d "%~dp0"
  2. echo data1 data2 data3 data4 data5 data6 data7 data8 time>ref.csv
  3. PowerShell "Foreach ($file in GC '.\ref.txt') {$str=$file -Replace '\s+',' ' -Replace '\"','';if ($str.Split(' ')[0] -match 'data[1-8]') {$name=$name + ' ' + ($str.Split(' ')[3]).Split('.')[0];if (($str.Split(' ')[0]).SubString(4,1) -eq 8) {$Line=$name.TrimStart()+' '+($str.Split(' ')[1]).Replace('-','/')+' '+$str.Split(' ')[2];AC \".\ref.csv\" -Value \"$Line\" -force;$name='';}}}"
  4. pause
复制代码
==========================

TOP

本帖最后由 yhcfsr 于 2018-11-26 12:12 编辑

我也来套Powershell
  1. <#
  2.     时间相同的数据必须要有8组且相邻,否则结果会混乱;
  3.     使用环境:仅限WIN10,WIN7(没使用过PS脚本的,自行百度食用方法)
  4. #>
  5. $content=[System.IO.File]::ReadAllLines('.\ref.txt',[text.encoding]::Default);
  6. <#变量初始化#>
  7. $count=$content.count;
  8. [System.Collections.ArrayList] $Result=@();
  9. $array=@{};
  10. $arr=@{};
  11. $lastTime=$i=0;
  12. do
  13. {
  14.     if(($i -ne 0) -and ($array.Count -eq 9)){
  15.        $Result+= New-Object psobject -Property @{
  16.             data1=$array.item('"data1"');
  17.             data2=$array.item('"data2"');
  18.             data3=$array.item('"data3"');
  19.             data4=$array.item('"data4"');
  20.             data5=$array.item('"data5"');
  21.             data6=$array.item('"data6"');
  22.             data7=$array.item('"data7"');
  23.             data8=$array.item('"data8"');
  24.             time =$array.item("time")   ;
  25.         }
  26.         $array.Clear();#清空上一组数据
  27.     }
  28.    if($i -eq $count){break;} #扫描完所有行后,退出循环
  29.    $line=$content[$i++] -split '\s{8}';#分割数据
  30.    if($line[0] -notmatch 'data\d+'){continue;}#非data数据行,跳过
  31.    $line[2]=[int]$line[2];#去小数点
  32.    <#将时间相同的数据保存为一个数组#>
  33.    if($lastTime -ne $line[1] ){$lastTime = $line[1];$array.Add("time",($line[1] -replace '^"(.*):\d+"$','$1'));$array.Add($line[0],$line[2]);}
  34.    else{$array.Add($line[0],$line[2]);}
  35.   
  36. }while($i -lt $count);
  37. <#输出到CSV文件#>
  38. $Result|Select-Object data1,data2,data3,data4,data5,data6,data7,data8,time|Export-Csv .\ref.csv -NoTypeInformation
复制代码
QQ 33892006

TOP

回复 5# xczxczxcz

你好,大哥 ,很感谢你对我的问题的及时回复, 。
我用了你下面的powershell脚本,已经实现了排序功能,生成的.csv文档,所有数据都排列在一列了,可以让这些数据分9列显示吗?这个该怎么加代码
这样就非常完美了

TOP

回复 7# shaohua

本来就是9列显示的。为何还要9列?

TOP

回复 8# xczxczxcz
谢谢

TOP

返回列表