loops - 批处理文件:计算重复的 id 并将它们写入 csv 列
问题描述
我目前正在尝试通过批处理文件自动化 csv 文件的预处理过程。我有下表:
id;street;name;nrOfIds
4014001;T1;example1;0
4014002;B2;example2;0
4014003;B3;example3;0
4014004;L1;example4;0
4015001;M3;example5;0
4015002;B9;example6;0
4016001;T4;example7;0
4016002;L2;example8;0
4016003;L1;example9;0
第一行“id”保存条目的 id,该条目由最后 3 个数字组成(例如 001、002、003、...)。最后三位数字之前的数字不是唯一的。正如您在结果表中看到的,我想计算 ID 的第一部分(即最后三位数字之前的部分)在表中存在的频率,我想将总和写入名为“nrOfIds”的第三列. 结果表应如下所示:
id;street;name;nrOfIds
4014001;T1;example1;4
4014002;B2;example2;4
4014003;B3;example3;4
4014004;L1;example4;4
4015001;M3;example5;2
4015002;B9;example6;2
4016001;T4;example7;3
4016002;L2;example8;3
4016003;L1;example9;3
例如,第一行(4014)最后三位之前的部分在整个表中恰好存在4次,所以我在“nrOfIds”列中写了4,以此类推。
用于此的代码如下所示:
@echo off
setlocal enabledelayedexpansion
for /F "tokens=1-3* delims=;" %%a in (%PREPROCESSING_INPUT_PATH%%INPUT_FILENAME%) do (
(echo %%a;%%b;%%c)> "%PREPROCESSING_INPUT_PATH%%OUTPUT_FILENAME%" & goto :file
)
:file
(for /F "skip=1 tokens=1-3* delims=;" %%a in (%PREPROCESSING_INPUT_PATH%%INPUT_FILENAME%) do (
REM count ids (like 4014, 4015, ... and write sum into "nrOfIds" column
)
) >> %PREPROCESSING_OUTPUT_PATH%%OUTPUT_FILENAME%
pause
关于如何做到这一点的任何建议?非常感谢您!非常感谢您的帮助。
解决方案
与我之前发布的答案非常相似,这里我们只是find /C
用来识别 ID 的最后 3 位数字的出现次数:
@echo off
setlocal enabledelayedexpansion
set "infile=z:\folder31\testcsv.csv"
set "outfile=%PREPROCESSING_OUTPUT_PATH%testOutput.csv"
for /f "usebackq delims=" %%a in ("%infile%") do (
(echo %%a)>"%outfile%" & goto :file
)
:file
(for /f "skip=1 usebackq tokens=1-4*delims=;" %%a in ("%infile%") do (
set "match=%%a"
for /f %%i in ('findstr /B "!match:~0,-3!" "%infile%" ^| find /C "!match:~0,-3!"') do (
set /a _cnt=%%i
echo %%a;%%b;%%c;!_cnt!
)
)
)>>"%outfile%"
调试版本:
@echo off
setlocal enabledelayedexpansion
set "infile=%PREPROCESSING_INPUT_PATH%%INPUT_FILENAME%"
set "outfile=%PREPROCESSING_OUTPUT_PATH%%OUTPUT_FILENAME%"
for /f "usebackq delims=" %%a in ("%infile%") do (
(echo %%a) & goto :file
)
:file
(for /f "skip=1 usebackq tokens=1-4*delims=;" %%a in ("%infile%") do (
set "match=%%a"
for /f %%i in ('findstr /B "!match:~0,-3!" "%infile%" ^|find /C "!match:~0,-3!"') do (
set /a _cnt=%%i
echo %%a;%%b;%%c;!_cnt!
)
)
)
pause
推荐阅读
- python-3.x - sqlite3.OperationalError:没有这样的列:current_month_value
- r - 趋势图无法正确绘制
- python - 如何将布局从一个 dxf 复制到另一个 dxf?
- amazon-web-services - 在 Terraform 中创建 VPC 和相应的子网
- sql - 在 Redshift SQL 中查找指定日期之前的 Max(Date)
- python - 动画利萨如曲线不可见 python
- statistics - 使用二维空间信息检测异常值
- html - 带有剃须刀页面的 ASP.NET Core 上未显示图像
- python - 使用自定义标签访问 ndarray 列
- javascript - 在 Node.js 中使用 Lodash 访问数组的特定元素