Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 批处理文件:计算重复ID并将其写入csv列中_Loops_Csv_Batch File_Automation_Preprocessor - Fatal编程技术网

Loops 批处理文件:计算重复ID并将其写入csv列中

Loops 批处理文件:计算重复ID并将其写入csv列中,loops,csv,batch-file,automation,preprocessor,Loops,Csv,Batch File,Automation,Preprocessor,我目前正试图通过批处理文件自动化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;exampl

我目前正试图通过批处理文件自动化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个digt(例如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
@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
例如,第一行(4014)最后三位之前的部分在整个表中正好存在4次,因此我在“nrOfIds”列中写入4,以此类推

用于此操作的代码如下所示:

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
@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

此方法简单且运行速度快:

@echo off
setlocal enabledelayedexpansion

rem Count ids
for /F "skip=1 delims=;" %%a in (input.txt) do (
   set "id=%%a"
   set /A "count[!id:~0,-3!]+=1"
)

rem Update the file
set "header="
(for /F "tokens=1-4 delims=;" %%a in (input.txt) do (
   if not defined header (
      echo %%a;%%b;%%c;%%d
      set "header=1"
   ) else (
      set "id=%%a"
      for /F %%i in ("!id:~0,-3!") do echo %%a;%%b;%%c;!count[%%~i]!
   )
)) > output.txt

基于外部命令的方法,如
findstr
find
,速度较慢…

这与我昨天提供的解决方案有关吗?似乎是这样,如果是这样,请将代码复制到这个问题中,并尝试解决这个问题,否则它将被视为离题。如果你那样做,我可以帮你。嘿,格哈德!不,事实并非如此。这只是我需要做的另一个预处理步骤。也许你可以再帮我一次?我将非常感谢,因为我不是很有经验的编写批处理文件@Gerhard我已经复制了代码(部分代码是您在昨天的问题中编写的)。我相信需要有一个嵌套循环来计算重复的ID,但我不知道如何在批处理文件中做到这一点。非常感谢你的帮助!如果我有一个基于实用程序(命令行)的解决方案,它适合您吗?或者它必须是一个批处理脚本?嘿@aboruso,它必须是一个批处理脚本。嘿,我又发现了一个小错误。当输入文件的列值为空时,输出文件将不会从csv复制空单元格。而是将下一列中的值复制到空单元格中。如何防止这种情况发生?行中只有第一列是空的吗?还是整行?我有各种输入文件。在我今天测试的一个输入文件中,现在列名中有了值。因此,在输出文件中,“name”列具有下一列(即nrOfIds)的值。在输出csv文件中,它应该写入;;对于空单元格。例如4014001;T1;;4.但现在它写的是4014001;T1;4是的,我知道,但是在这些文件中,整行是空的,还是只有第一列?或者,“name”列都不是空的,这是第三列