【问题标题】:Filter csv files and create a new set of .csv files with the data过滤 csv 文件并使用数据创建一组新的 .csv 文件
【发布时间】:2014-02-22 15:22:31
【问题描述】:

我希望创建一个 .cmd 文件,该文件过滤文件夹中的所有 .csv 文件,然后创建一组带有结果的 .csv 文件。

这是场景。

一个文件夹中有许多 .csv 文件
csv文件第一列数据包含代码HH??????-XX, 其中?????? 可以是任意一组数字,XX 的范围为 01 to 48

我希望批处理文件从 01 开始 XX,并且在找到 HH??????-01 的位置获取该行并将结果放入名为 -01.csv 的输出文件中

开头的代码HH 可能不同,因此它还必须过滤HH

然后对文件夹中的每个 csv 文件重复此操作。

然后对HH??????-02 重复整个过程,并将文件输出到名为-02.csv 的csv,依此类推,直到-48.csv

我没有太多 - 我根本不是这个领域的专家,只在 VBA 方面

我从网上获得了这个模板,我认为我可以改进它,但我真的不明白我该如何适应它。我不熟悉 FOR 循环

@echo off
del c:\Total.csv
Del c:\Final.csv

Type c:\BATTEST\*.CSV > c:\Total.csv

FOR /F "eol=- delims=~ tokens=1-5,6,7*" %%1 IN ( c:\Total.CSV ) DO IF %%4 EQ 456 ECHO  %%1 %%2 %%3 %%4 %%5 %%6 %%7 %%8 >> c:\Final.csv

.csv 文件中的示例行是:(请记住,HH 可能有所不同)

HH777777-01,A,500,200,10,11,12,13,15.2,17.9,26,B
HH236748-02,C,300,100,11,14,17,19,21.2,18.9,14,B

每个文件都有一个相同的头文件,最好在最终的输出文件中有这个头文件。

标题是

Code,type,head,file,make,run,style,line,edge,model,letter,status

【问题讨论】:

  • 我相信文件中的一些实际示例可以帮助人们理解需求(所有*s 和XXs 都有些混乱)。另外,到目前为止你有什么?你熟悉FOR批量循环吗?
  • @mbroshi 感谢您的回复我已经更新了我的帖子以提供更多信息

标签: batch-file csv batch-processing


【解决方案1】:

编辑:为source folder 添加了target folder 和cd 命令。

这在这里有效 - 在一些示例文件上进行测试。

@echo off
setlocal enabledelayedexpansion
set "target=d:\target\folder"
cd /d "c:\source\folder"
for /L %%a in (101,1,148) do (
    set num=%%a
    del "%target%\-!num:~-2!.csv" 2>nul
    >"%target%\-!num:~-2!.csv.txt" echo Code,type,head,file,make,run,style,line,edge,model,letter,status
)

for %%a in (*.csv) do (
    for /f "skip=1 usebackq delims=" %%b in ("%%a") do (
        for /f "tokens=1,2 delims=-," %%c in ("%%b") do (
           set "line=%%c"
           if /i "!line:~0,2!"=="HH" >> "%target%\-%%d.csv.txt" echo %%b
        )
    )
)
ren "%target%\*.csv.txt" *.
pause

【讨论】:

  • 你到底是怎么做这个foxidrive的,这绝对是惊人的!我在哪里可以学到这个????
  • 我可以再问一个问题..我如何将其瞄准特定文件夹并将输出文件指向另一个文件夹?
  • 我无法完全理解您的脚本,但它说要在哪里查找文件 -01 到 -48?
  • 我编辑了答案并添加了路径,但没有对其进行测试。 -10 到 -48 来自数据,在代码的第二部分中,数字被放置在标记 2 中,即%%d,在被分隔符与数据分隔后。
【解决方案2】:
@ECHO OFF
SETLOCAL
FOR /L %%a IN (101,1,148) DO CALL :header %%a

FOR %%f IN (q21956251*.csv) DO (
 FOR /f "usebackqskip=1delims=" %%a IN ("%%f") DO (
  FOR /f "tokens=2delims=-," %%d IN ("%%a") DO (
   FOR /L %%h IN (101,1,148) DO IF "1%%d"=="%%h" >>"-%%d.new" ECHO(%%a
  )
 ) 
)
FOR /L %%a IN (101,1,148) DO CALL :rennew %%a

GOTO :EOF

:header
SET "destfile=%1"
>"-%destfile:~-2%.new" ECHO(Code,type,head,file,make,run,style,line,edge,model,letter,status
DEL "-%destfile:~-2%.csv" 2>NUL
GOTO :eof
:rennew
SET "destfile=%1"
REN "-%destfile:~-2%.new" "-%destfile:~-2%.csv"
GOTO :eof

您没有解释The code HH at the beginning could be different so it would have to also filter for HH 的意思 - 如果没有明确的说明,我们会开始猜谜游戏。

此例程将首先为 n=01 到 48 创建一组名为 -nn.new 的新文件,将标题行写入每个文件,然后删除任何现有的 -nn.csv

下一步是选择所有.csv 文件 - 我选择q21956251*.csv 进行测试。每个文件名依次分配给%%f

然后%%a 接收来自文件%%f 的每一行。 "usebackqis required because%%fis quoted (in case of spaces in filenames). Theskip=1means skip the first line (because it's a header) and thedelims=meansassign 整行`。

下一个for 查看%%a 中的行并选择第二组(tokens=2)字符,其中-, 都是分隔符。这应该从您的数据中选择01 和“02”。然后将数字“101”到“148”与1 的串联与检索到%%d 的数字进行比较。当匹配时,从文件中读取的行 %%a 将附加到 -%%d.new

当所有.csv 文件都处理完毕后,:rennew 例程将所有-nn.new 重命名为-nn.csv

可以在没有重命名循环的情况下处理此序列。我就是这么用的。

【讨论】:

  • 这似乎不起作用,它使用创建名称创建 csv 文件并将标题放入每个文件中,但是它不会将数据放入 csv 中。 Foxi 的方法效果很好。但是,我感谢您努力提供帮助:D 我们可以看看为什么它不起作用??
  • 您确实将 q21956251*.csv 更改为 *.csv 不是吗?
  • 你好 Magoo,刚刚测试过它同样有效。感谢您的替代回复
【解决方案3】:

可以使用EasyMorph(它有免费版本)来过滤各种条件的 CSV。您可能需要使用 EasyMorph 中的参数将 XX 代码传递到项目中。

【讨论】:

    猜你喜欢
    • 2016-10-22
    • 1970-01-01
    • 2016-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多