将csv编译成一个主文件然后输出错误?
Compiling csv into one master file then output error?
我想为我的公司做点什么。基本上我需要做的是
- 将一个文件夹中的所有csv编译成一个主文件。
- 从主文件中,将主文件中发现的潜在错误代码输出给用户。
关键是让它自动化。意思是,我只想按一个按钮或做一个步骤,它会立即为我做第 1 步和第 2 步。
问题是我不知道我应该使用或查看什么软件或编码。如果有人能启发我应该如何处理这个问题,那就太好了?
注:我对这些东西了解有限,但愿意学习。
====
编辑:
举个更好的例子,
File1.csv
Voltage Ampere Power Error ID
==============================================
6V 3A 6W 18-ABB 000123
8V 2A 7W 0 123991
8V 10A 25W 25-ASB 461233
10V 23A 10W 18-ABB 248811
1V 2A 9W 0 321881
File2.csv
Voltage Ampere Power Error ID
==============================================
6V 4A 6W 0 312313
3V 5A 7W 0 123312
2V 10A 5W 25-ASB 461643
1V 2A 10W 18-ABB 656474
11V 2A 9W 0 124242
我想达到的目标,
将文件1和文件2编译成一个master.csv如下,
master.csv
File1
Voltage Ampere Power Error ID
==============================================
6V 3A 6W 18-ABB 000123
8V 2A 7W 0 123991
8V 10A 25W 25-ASB 461233
10V 23A 10W 18-ABB 248811
1V 2A 9W 0 321881
File2
Voltage Ampere Power Error ID
==============================================
6V 4A 6W 0 312313
3V 5A 7W 0 123312
2V 10A 5W 25-ASB 461643
1V 2A 10W 18-ABB 656474
11V 2A 9W 0 124242
编译时master.csv必须包含文件名。从 master.csv 中,找到错误代码为 18-ABB 或 25-ASB 的机器 ID(它是可变的,但如果它是 0,则表示没有错误)并将其隔离到一个新的调用中,例如 outputerror.csv文件。
headers(电压等)需要转移到新的 outputerror.csv 文件中。
因此,outputerror.csv 应该是这样的,
outputerror.csv
Voltage Ampere Power Error ID
==============================================
File1
6V 3A 6W 18-ABB 000123
8V 10A 25W 25-ASB 461233
10V 23A 10W 18-ABB 248811
File2
2V 10A 5W 25-ASB 461643
1V 2A 10W 18-ABB 656474
已更新
@ECHO OFF
REM Delete any old output files, ignoring any error messages
DEL MASTER.CSV ERROR.CSV 2>NUL:
REM Keep track of file number in FNUM
SET /A FNUM=1
REM Loop through all files whose names look like "2015-03-01.CSV"
FOR %%A IN ( *-*-*.csv ) DO (
SET FNAME=%%A
CALL :PROCESSFILE
SET /A FNUM+=1
)
GOTO :EOF
REM ######################################################################
REM PROCESSFILE SUBROUTINE
REM ######################################################################
:PROCESSFILE
SET /A LNUM=1
REM New file, append its name to MASTER
ECHO %FNAME% >> MASTER.CSV
FOR /F "tokens=*" %%L IN (%FNAME%) DO (
SET LINE=%%L
CALL :PROCESSLINE
SET /A LNUM+=1
)
GOTO :EOF
REM ######################################################################
REM PROCESSLINE SUBROUTINE
REM ######################################################################
:PROCESSLINE
FOR /F "tokens=1-5 delims=," %%T in ("%LINE%") DO (
ECHO %LINE% >> MASTER.CSV
IF %LNUM% EQU 1 (
REM Output header line to ERROR if processing first file
IF %FNUM% EQU 1 ECHO %LINE% >> ERROR.CSV
REM Output filename to ERROR for all files
ECHO %FNAME% >> ERROR.CSV
) ELSE (
REM Output lines where field 4 is not "-" to ERROR
IF NOT "%%W" == "-" ECHO %LINE% >> ERROR.CSV
)
)
GOTO :EOF
使用 awk
实际上要容易得多 - 实际上它只有 2 行代码!我建议从 here 下载 awk.exe
。它非常强大,可以帮助完成任何脚本或文本处理任务。
手册可用here。
整个事情就变成了,很多行注释和两行代码(第三行和最后一行),你运行和我的其他全Windows解决方案一样.
@ECHO OFF
REM Print the contents of all CSV files whose names look like a date, e.g. 2012-11-01.csv, and add their name in ahead of line 3
awk "FNR==3{print FILENAME}1" *-*-*.csv > MASTER.CSV
REM From MASTER.CSV, print the following lines out to file ERROR.CSV:
REM ... first 3 lines, i.e. Record Number < 4
REM ... any lines containing "CSV" or "csv"
REM ... no lines with "Voltage" or "="
REM ... any lines with field4 != "0"
awk "NR<4 || /csv/ || /CSV/{print;next} /Voltage|=/{next} !=\""0\""" MASTER.CSV > ERROR.CSV
我想为我的公司做点什么。基本上我需要做的是
- 将一个文件夹中的所有csv编译成一个主文件。
- 从主文件中,将主文件中发现的潜在错误代码输出给用户。
关键是让它自动化。意思是,我只想按一个按钮或做一个步骤,它会立即为我做第 1 步和第 2 步。
问题是我不知道我应该使用或查看什么软件或编码。如果有人能启发我应该如何处理这个问题,那就太好了?
注:我对这些东西了解有限,但愿意学习。
====
编辑:
举个更好的例子,
File1.csv
Voltage Ampere Power Error ID
==============================================
6V 3A 6W 18-ABB 000123
8V 2A 7W 0 123991
8V 10A 25W 25-ASB 461233
10V 23A 10W 18-ABB 248811
1V 2A 9W 0 321881
File2.csv
Voltage Ampere Power Error ID
==============================================
6V 4A 6W 0 312313
3V 5A 7W 0 123312
2V 10A 5W 25-ASB 461643
1V 2A 10W 18-ABB 656474
11V 2A 9W 0 124242
我想达到的目标,
将文件1和文件2编译成一个master.csv如下,
master.csv
File1
Voltage Ampere Power Error ID
==============================================
6V 3A 6W 18-ABB 000123
8V 2A 7W 0 123991
8V 10A 25W 25-ASB 461233
10V 23A 10W 18-ABB 248811
1V 2A 9W 0 321881
File2
Voltage Ampere Power Error ID
==============================================
6V 4A 6W 0 312313
3V 5A 7W 0 123312
2V 10A 5W 25-ASB 461643
1V 2A 10W 18-ABB 656474
11V 2A 9W 0 124242
编译时master.csv必须包含文件名。从 master.csv 中,找到错误代码为 18-ABB 或 25-ASB 的机器 ID(它是可变的,但如果它是 0,则表示没有错误)并将其隔离到一个新的调用中,例如 outputerror.csv文件。
headers(电压等)需要转移到新的 outputerror.csv 文件中。
因此,outputerror.csv 应该是这样的,
outputerror.csv
Voltage Ampere Power Error ID
==============================================
File1
6V 3A 6W 18-ABB 000123
8V 10A 25W 25-ASB 461233
10V 23A 10W 18-ABB 248811
File2
2V 10A 5W 25-ASB 461643
1V 2A 10W 18-ABB 656474
已更新
@ECHO OFF
REM Delete any old output files, ignoring any error messages
DEL MASTER.CSV ERROR.CSV 2>NUL:
REM Keep track of file number in FNUM
SET /A FNUM=1
REM Loop through all files whose names look like "2015-03-01.CSV"
FOR %%A IN ( *-*-*.csv ) DO (
SET FNAME=%%A
CALL :PROCESSFILE
SET /A FNUM+=1
)
GOTO :EOF
REM ######################################################################
REM PROCESSFILE SUBROUTINE
REM ######################################################################
:PROCESSFILE
SET /A LNUM=1
REM New file, append its name to MASTER
ECHO %FNAME% >> MASTER.CSV
FOR /F "tokens=*" %%L IN (%FNAME%) DO (
SET LINE=%%L
CALL :PROCESSLINE
SET /A LNUM+=1
)
GOTO :EOF
REM ######################################################################
REM PROCESSLINE SUBROUTINE
REM ######################################################################
:PROCESSLINE
FOR /F "tokens=1-5 delims=," %%T in ("%LINE%") DO (
ECHO %LINE% >> MASTER.CSV
IF %LNUM% EQU 1 (
REM Output header line to ERROR if processing first file
IF %FNUM% EQU 1 ECHO %LINE% >> ERROR.CSV
REM Output filename to ERROR for all files
ECHO %FNAME% >> ERROR.CSV
) ELSE (
REM Output lines where field 4 is not "-" to ERROR
IF NOT "%%W" == "-" ECHO %LINE% >> ERROR.CSV
)
)
GOTO :EOF
使用 awk
实际上要容易得多 - 实际上它只有 2 行代码!我建议从 here 下载 awk.exe
。它非常强大,可以帮助完成任何脚本或文本处理任务。
手册可用here。
整个事情就变成了,很多行注释和两行代码(第三行和最后一行),你运行和我的其他全Windows解决方案一样.
@ECHO OFF
REM Print the contents of all CSV files whose names look like a date, e.g. 2012-11-01.csv, and add their name in ahead of line 3
awk "FNR==3{print FILENAME}1" *-*-*.csv > MASTER.CSV
REM From MASTER.CSV, print the following lines out to file ERROR.CSV:
REM ... first 3 lines, i.e. Record Number < 4
REM ... any lines containing "CSV" or "csv"
REM ... no lines with "Voltage" or "="
REM ... any lines with field4 != "0"
awk "NR<4 || /csv/ || /CSV/{print;next} /Voltage|=/{next} !=\""0\""" MASTER.CSV > ERROR.CSV