将csv编译为一个主文件,然后输出错误?

将csv编译为一个主文件,然后输出错误?,csv,compilation,output,Csv,Compilation,Output,我想为我的公司做点什么。基本上我需要做的是 将文件夹中的所有csv编译为一个主文件 从主文件,将主文件中发现的潜在错误代码输出给用户 关键是让它自动化。意思是,我只想按下一个按钮或执行一个步骤,它会立即为我执行步骤1和2 问题是我不知道我应该使用或查看什么软件或编码。如果有人能告诉我应该如何处理这件事,那就太好了 注:我对这些事情了解有限,但愿意学习 ==== 编辑: 举个更好的例子 File1.csv Voltage Ampere Power Error ID

我想为我的公司做点什么。基本上我需要做的是

  • 将文件夹中的所有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文件

    标题(电压等)需要结转至新的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
    ,这实际上要容易得多-事实上,它只有两行代码!我建议从下载
    awk.exe
    。它功能强大,可以帮助完成任何脚本或文本处理任务

    该手册可供查阅

    然后,整个过程变成了许多行注释和两行代码(第三行和最后一行),您运行的方式与我的其他全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} $4!=\""0\""" MASTER.CSV > ERROR.CSV
    
    @ECHO关闭
    REM打印名称类似日期的所有CSV文件的内容,例如2012-11-01.CSV,并将其名称添加到第3行之前
    awk“FNR==3{print FILENAME}1”*-*-*-*.csv>MASTER.csv
    REM从MASTER.CSV打印以下行到文件ERROR.CSV:
    雷姆。。。前3行,即记录编号<4
    雷姆。。。任何包含“CSV”或“CSV”的行
    雷姆。。。没有带“电压”或“=”的线路
    雷姆。。。任何带有字段4的行!="0"
    
    awk“研究在任务中使用Perl。学习的开销相对较低,它是为处理文本文档而设计的。谢谢,Perl是否类似于HTML,您需要一个基于web的主机来托管代码?步骤2到底是什么?目前还不清楚。步骤1很简单,您只需键入
    cat*.csv>MASTER
    ,或者,如果您在Windows上(您不提供任何线索),您可以执行
    type*.csv>MASTER
    Perl脚本编写,您完全可以在自己的计算机上完成,而无需任何web托管。这是解决你问题的方法。我为缺乏信息而道歉。不太确定我应该提供什么信息。是的,我正在Windows上运行。为了解释步骤2,csv基本上是来自多台机器的数据列表。例如,csv文件中有10台机器,每列中的每个机器参数为电压、电流、功率和错误代码。我希望第2步从主机输出结果,并立即告诉我哪台机器有错误代码(例如18-ABB是错误代码)。谢谢。有没有办法将有错误的机器输出为csv文件而不是成批显示?请再看一看-我已经更新了答案。你好,马克,非常感谢。我们快到了。现在只有2个问题是1)在错误文件中,它仍然显示所有数据。我想让它隔离,只显示错误代码为18-ABB和25-ASB的行或列。在错误文件中,如何输入主文件中生成的文件名?(主文件捕获较小文件的文件名)。2) 如果我的文件名是按日期(例如2014-04-05和2014-04-06)而不是按文件1和文件2(您使用的是文件*),我如何使代码根据不同的文件名日期(如文件*)变为变量?非常感谢…嗨,马克,我自己解决了第二道题。只需将其更改为--*.csv即可。但第一个问题仍然需要帮助。>_尝试将结尾处的
    FINDSTR
    替换为
    FINDSTR“^[0-9]Voltage=-”MASTER.CSV
    ,它将查找以数字开头的行,例如您的文件名。您好,谢谢您的建议,但我目前更喜欢使用批处理来完成此任务。