将不同行的子字符串合并为一行中的循环

时间:2017-08-28 20:12:04

标签: excel csv batch-file

我有一个包含一些数据的.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文件中的正确行。

感谢您的帮助。我已对此进行了编辑,以包含更多相关示例和详细信息。

2 个答案:

答案 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.exenin-Win32.exe

Extract -> Classify -> Check-Add-Column