我有一个包含一些数据的.txt文件,其中“BARREL-5,BODY-3”等正在测量,“V”是测量值后的小数,以及日期(没有精确时间用于识别测量所属的样本,因此
4491 316 SS,BARREL-5,V,1.393,5/7/2015 7:47:05 AM,0,,,,13,...
4491 316 SS,BARREL-5,V,1.3865,2/17/2016 11:26:12 AM,0,,,,13,...
4491 316 SS,BODY-3,V,1.256,5/6/2015 6:45:42 PM,0,,,,13,...
4491 316 SS,BODY-3,V,1.2565,5/7/2015 7:46:16 AM,0,,,,13,...
4491 316 SS,BODY-3,V,1.246,2/17/2016 11:24:18 AM,0,,,,13,...
只有每次我们对一批零件进行样品测量时,才会以.txt格式从(真正过时的)程序中导出此数据。需要在excel中查看数据,以快速确定批次零件是否在公差范围内。更改扩展并使用它的问题是整行数据如下:
4491 316 SS,BARREL-5,V,1.393,5/7/2015 7:47:05 AM,0,,,,13,Blow Pattern=1-1-1,Die Set=FN3,Forge=Erie,Heat #=E150058,Job #=I2928,Lube Type=Hydraforge,Operator=Paul & ,Revision=C,Run Temperature=2250,Shift=2nd,Shim bottom Die=X,Shim Top Die=X,Shim Trimmer=X,C
这在excel中非常混乱,并且列数有时会变化+1(如果0代替1,则在0,,,,
中的0后面添加一列。)
我想要的输出,以txt格式,看起来像这样:
Project Number: 4491,,,, Material: 316 SS
,5/7/2015,2/17/2016,5/6/2015
BARREL-5,1.393,1.3865,NA
BODY-3,1.256,1.2565,1.246
现在我循环遍历所有行,提取所有日期,删除所有重复项(下至每个唯一日期的列表),然后将其转换为csv文件中的字符串,date1,date2,date3,etc
。
然后我再次遍历数据文件并将变量名称放在一个新行上,首先检查它是否重复,如果是,则不回显该变量名称。我使用以下for循环来执行此操作(filePath是一个文件路径和项目编号组合在一起,根据需要添加文件扩展名或名称添加):
for /f "tokens=1 delims=," %%a IN (%filePath%.txt) DO (
set varname=%%a%
find "!varname!" %filePath%Excel.csv
if !errorlevel!==1 (echo !varname! >> %filePath%Excel.csv)
)
我目前的输出基本上是这样的:
Project Number: 4491,,,, Material: 316 SS
,5/7/2015,2/17/2016,5/6/2015
BARREL-5,
BODY-3,
如您所见,我需要将实际测量值放在适当的位置。有没有简单的方法可以批量执行此操作?任何人都可以在任何计算机(Win 7和XP)上轻松运行代码。数据文件不太可能很快改变,因此程序不需要非常强大。我也受到了尝试使用Powershell这一事实的限制,但发现我不允许在任何计算机上运行任何脚本......
我不愿意深入研究的方法是创建每行的行号列表,切换到新的测量名称,然后在文件中运行另一个循环。打印同一行上的所有值,根据行数将其分解。然后将变量行连接到csv文件中的正确行。
感谢您的帮助。我已对此进行了编辑,以包含更多相关示例和详细信息。
答案 0 :(得分:2)
您的描述令人困惑,您没有显示所需的输出,因此无法尝试为您的问题编写解决方案......但是,您可以通过批处理文件获取部分要求简单的方法:
@echo off
setlocal EnableDelayedExpansion
set "dates="
for /F "tokens=1-3 delims=," %%a in (test.txt) do (
rem Get a list of unique dates:
set "dates=!dates:%%c,=!%%c,"
rem Take the values of the variables
set "var[%%a]=!var[%%a]!,%%b"
)
rem Show the results
echo Dates: %dates:~1,-1%
echo/
echo Variables:
for /F "tokens=2* delims=[]=" %%a in ('set var[') do echo %%a%%b
将此数据用作输入文件:
varname1,valueA,date1
varname1,valueB,date2
varname1,valueC,date3
varname2,valueD,date1
varname2,valueE,date2
varname2,valueF,date3
......这是输出:
Dates: date1,date2,date3
Variables:
varname1,valueA,valueB,valueC
varname2,valueD,valueE,valueF
编辑:修改了代码以实现新规范
@echo off
setlocal EnableDelayedExpansion
set "max=0"
set "dates=,"
for /F "tokens=1-4,6,7 delims=, " %%a in (test.txt) do (
rem Get header data
set "project=%%a" & set "material=%%b %%c"
rem Get a list of unique dates
if "!dates:%%f=!" equ "!dates!" set "dates=!dates!%%f,"
rem Take the values of the variables
set "var[%%d]=!var[%%d]!,%%e"
rem Get data for variable equalization
set "data=%%d"
for /F %%D in ("!data:-=_!") do (
set /A "len[%%D]+=1"
if !len[%%D]! gtr !max! set "max=!len[%%D]!"
)
)
rem Equalize variables
set /A max-=1
for /F "tokens=2,3 delims=[]=" %%i in ('set len[') do (
set "data=%%i"
for /F %%D in ("!data:_=-!") do for /L %%I in (%%j,1,%max%) do (
set "var[%%D]=!var[%%D]!,NA"
)
)
rem Show the results
(
echo Project Number: %project%,,,, Material: %material%
echo %dates:~0,-1%
for /F "tokens=2* delims=[]=" %%a in ('set var[') do echo %%a%%b
) > output.txt
此程序生成的输出与问题中指定的完全相同
答案 1 :(得分:0)
通过2个命令行轻松解决您的问题,请参阅底部的截图。
:: Extract all dates and get unqiue
msr -p your-source.txt -t "^.*?,(\d+/\d+/\d+)\s+(\d+:\d+:\d+).*" -o "$1" -PAC | nin nul -uPAC | msr -S -t "(\S+)\s+" -o ",$1" -PAC >> result.csv
:: Extract column2 like "BARREL-5" -> Auto classify -> Extract values like "1.393" -> Add "NA" if lack columns
for /f "tokens=*" %%a in ('nin source.txt nul "^[^,]+,([^,]+)" -u -PAC') do @msr -p source.txt -t ".*?,%%a,V,(\d+\.\d+),.*" -o "$1" -PAC | msr -S -t "\s+(\S+)" -o ",$1" -PAC | msr -t "^\d+\.?\d*,\d+\.?\d*$" -o "$0,NA" -aPAC| msr -t ".+" -o "%%a,$0" -PAC >> result.csv
但我不知道你的第一行如何出来:Project Number: 4491,,,, Material: 316 SS
以上使用2个常见的单个exe工具(无依赖关系):msr.exe
( M atch / S earch / R 在我的开放项目https://github.com/qualiu/msr nin.exe
目录中,+ tools
( N ot- In -latter:获得差异/交集)
如果您使用的是32位Windows,请使用msr-Win32.exe
和nin-Win32.exe
。