标题: [文本处理] .bat解析TXT多行多列显示,并生成.csv [打印本页]
作者: shaohua 时间: 2018-11-25 12:40 标题: .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
作者: xczxczxcz 时间: 2018-11-25 14:01
不是最佳效率。- @echo off & cd /d "%~dp0"
- setlocal EnableDelayedExpansion
-
- echo data1 data2 data3 data4 data5 data6 data7 data8 time
- for /f "tokens=1-4 delims= " %%a in (ref.txt) do (
- set "n1=%%a" & set "n2=%%b" & set "n3=%%c" & set "n4=%%d"
- set "n2=!n2:-=/!"
- echo %%a|findstr /i "data[1-8]">nul && (
- set "VarValue=!VarValue! !n4:.000000=!"
- if /i "!n1:~1,-1!"=="data8" (
- echo !VarValue:~1! !n2:~1! !n3:~0,-1!
- set "VarValue="
- )
- )
- )
-
- pause
复制代码
===若文件固定,改一下速度很快。自行添加重定向以输出到csv。EXCEL中导入并以TAB键分格。===
作者: shaohua 时间: 2018-11-25 19:17
不是最佳效率。===若文件固定,改一下速度很快。自行添加重定向以输出到csv。EXCEL中导入并以TAB键分格。== ...
xczxczxcz 发表于 2018-11-25 14:01
非常感谢楼主,如每次解析的.txt文档,名字都为 ref.txt 解析完成,最后自动生成ref.csv这个代码怎么加呢?
作者: cfwyy77_bat 时间: 2018-11-26 10:11
使用gawk。
以下保存为script.awk- BEGIN {printf("data1,data2,data3,data4,data5,data6,data7,data8,time\n")}
- /data/ {a[NR]=$4;b[NR]=substr($2,2,11);c[NR]=substr($3,1,5)}
- END{
- for(i=2;i<=NR-2;i++)
- {
- if((i-1)%8)
- printf("%-2d,",a[i]);
- else printf("%-2d,%s %s\n",a[i],b[i],c[i]);
- }
- }
复制代码
再bat或bash调用- gawk -f 'script.awk' 1.txt >1.csv
复制代码
作者: xczxczxcz 时间: 2018-11-26 11:51
回复 3# shaohua
重定向应该会的。留着给你自添加,可以随意写。
第 4 行 行尾加 ">ref.csv" 不要引号
第 5 行 行首加 "(" 不要引号
第 15 行 行尾加 ")>>ref.csv" 不要引号
=================================
如果为 WIN7 及以上系统用下面这个更好。- @echo off & cd /d "%~dp0"
- echo data1 data2 data3 data4 data5 data6 data7 data8 time>ref.csv
- 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='';}}}"
- pause
复制代码
==========================
作者: yhcfsr 时间: 2018-11-26 12:01
本帖最后由 yhcfsr 于 2018-11-26 12:12 编辑
我也来套Powershell- <#
- 时间相同的数据必须要有8组且相邻,否则结果会混乱;
- 使用环境:仅限WIN10,WIN7(没使用过PS脚本的,自行百度食用方法)
- #>
- $content=[System.IO.File]::ReadAllLines('.\ref.txt',[text.encoding]::Default);
- <#变量初始化#>
- $count=$content.count;
- [System.Collections.ArrayList] $Result=@();
- $array=@{};
- $arr=@{};
- $lastTime=$i=0;
-
- do
- {
- if(($i -ne 0) -and ($array.Count -eq 9)){
- $Result+= New-Object psobject -Property @{
- data1=$array.item('"data1"');
- data2=$array.item('"data2"');
- data3=$array.item('"data3"');
- data4=$array.item('"data4"');
- data5=$array.item('"data5"');
- data6=$array.item('"data6"');
- data7=$array.item('"data7"');
- data8=$array.item('"data8"');
- time =$array.item("time") ;
- }
- $array.Clear();#清空上一组数据
-
- }
- if($i -eq $count){break;} #扫描完所有行后,退出循环
- $line=$content[$i++] -split '\s{8}';#分割数据
- if($line[0] -notmatch 'data\d+'){continue;}#非data数据行,跳过
- $line[2]=[int]$line[2];#去小数点
- <#将时间相同的数据保存为一个数组#>
- if($lastTime -ne $line[1] ){$lastTime = $line[1];$array.Add("time",($line[1] -replace '^"(.*):\d+"$','$1'));$array.Add($line[0],$line[2]);}
- else{$array.Add($line[0],$line[2]);}
-
- }while($i -lt $count);
- <#输出到CSV文件#>
- $Result|Select-Object data1,data2,data3,data4,data5,data6,data7,data8,time|Export-Csv .\ref.csv -NoTypeInformation
复制代码
作者: shaohua 时间: 2018-11-26 14:14
回复 5# xczxczxcz
你好,大哥 ,很感谢你对我的问题的及时回复, 。
我用了你下面的powershell脚本,已经实现了排序功能,生成的.csv文档,所有数据都排列在一列了,可以让这些数据分9列显示吗?这个该怎么加代码
这样就非常完美了
作者: xczxczxcz 时间: 2018-11-27 16:48
回复 7# shaohua
本来就是9列显示的。为何还要9列?
作者: shaohua 时间: 2018-11-30 21:26
回复 8# xczxczxcz
谢谢
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |