excel - 在批处理 for 循环中将不同行的子字符串组合成一行

标签 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,日期2、日期3等

然后,我再次循环遍历数据文件,并将变量名称放在新行上,首先检查它是否重复,如果是,则不回显该变量名称。我使用以下 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 文件中的正确行。

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

最佳答案

您的描述令人困惑,并且您没有显示所需的输出是什么,因此无法尝试为您的问题编写解决方案...但是,您的部分要求可以通过批处理文件以非常快的速度获得简单的方法:

@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

该程序生成的输出与问题中指定的完全相同...

关于excel - 在批处理 for 循环中将不同行的子字符串组合成一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45926669/

相关文章:

python - 如何对 CSV 文件中的数据进行聚类(或分组)?

windows - 如何通过 bat 文件在 Mac 上使用 ffmpeg.dmg 与 Windows 上的 ffmpeg.exe 相同的方式?

batch-file - 批处理文件中的条件语句

vba - 使用 .ExportAsFixedFormat 保存文件时出错

vba - 加速 Excel 宏作为打开

ruby - CSV.foreach不读取CSV文件中的第一列

windows - 在 Linux 的 Windows 子系统中执行批处理文件

excel - 添加注释作为公式

excel - Word VBA 解决复制粘贴到 Excel 时的换行或段落标记问题

java - 带有 JSON 列的 CSV