【问题标题】:Compiling csv into one master file then output error?将csv编译成一个主文件然后输出错误?
【发布时间】:2015-05-06 06:44:01
【问题描述】:

我正在努力为我的公司做点什么。基本上我需要做的是

  1. 将一个文件夹中的所有csv编译成一个主文件。
  2. 从主文件中,将在主文件中找到的潜在错误代码输出给用户。

关键是让它自动化。意思是,我只想按一个按钮或执行一个步骤,它会立即为我执行第 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

我想要达到的,

将file1和file 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(它是可变的,但如果为 0,则表示没有错误)的机器 ID 并将其隔离到一个新的名为 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

【问题讨论】:

  • 研究使用 Perl 来完成您的任务。学习的开销相对较低,并且是为处理文本文档而设计的。
  • 谢谢,Perl 是不是类似于 HTML,您需要基于 Web 的主机来托管代码?
  • 步骤 2 到底是什么?这是非常不清楚的。第 1 步很简单,您只需输入 cat *.csv > MASTER 或者,如果您在 Windows 上(您不提供任何线索),您可以输入 TYPE *.csv > MASTER
  • Perl 脚本是您可以完全在自己的计算机上完成的事情,无需任何网络托管。这是解决问题的方法。
  • 对于信息的缺乏,我深表歉意。不太确定我应该真正提供什么信息。是的,我在 Windows 上运行。为了解释第 2 步,基本上 csv 是来自多台机器的数据列表。例如 csv 文件中有 10 台机器,每列机器参数为电压、电流、功率和错误代码。我希望第 2 步从主机输出结果并立即告诉我哪台机器有错误代码(例如 18-ABB 是错误代码)。

标签: csv compilation output


【解决方案1】:

更新

@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

【讨论】:

  • 谢谢。有什么方法可以将有错误的机器输出为 csv 文件而不是在 BATCH 中显示?
  • 请再看看 - 我已经更新了我的答案。
  • 嗨,马克,非常感谢。我们就快到了。现在只有2个问题是1)在错误文件中,它仍然显示所有数据。我希望它隔离并仅显示错误代码为 18-ABB 和 25-ASB 的行或列。同样在错误文件中,我如何输入在主文件中生成的文件名? (主文件捕获了较小文件的文件名)。 2)如果假设我的文件名是按日期计算的,例如 2014-04-05 和 2014-04-06 而不是 file1 和 file2(你使用了 file*),我怎样才能使代码根据不同的变量变为变量文件名日期,如文件*?非常感谢...
  • 嗨,马克,我自己解决了第 2 个问题。只需将其更改为 --*.csv 即可。不过,第一个问题仍然需要帮助。 >_
  • 尝试用FINDSTR "^[0-9] Voltage = -" MASTER.CSV 替换末尾的FINDSTR - 这将找到以数字开头的行,例如您的文件名。
【解决方案2】:

这实际上使用awk 更容易 - 事实上它只有 2 行代码!我建议从here 下载awk.exe。它非常强大,可以帮助完成任何脚本或文本处理任务。

手册可在here获取。

然后整个事情就变成了,多行注释和 2 行代码(第三行和最后一行),您可以像我的其他全 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

【讨论】:

  • 嗨,马克,感谢您的建议,但我目前更喜欢使用 BATCH 来完成这项任务。
猜你喜欢
  • 2011-06-10
  • 1970-01-01
  • 2021-08-28
  • 2022-01-04
  • 2017-06-30
  • 1970-01-01
  • 2022-09-27
  • 1970-01-01
  • 2017-02-01
相关资源
最近更新 更多