过滤csv文件并使用数据创建一组新的.csv文件

时间:2014-02-22 15:22:31

标签: batch-file csv batch-processing

我希望创建一个.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

3 个答案:

答案 0 :(得分:0)

编辑:为target folder添加了source 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

答案 1 :(得分:0)

@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中的每一行。 " usebackq is required because %% f is quoted (in case of spaces in filenames). The skip = 1 means skip the first line (because it's a header) and the delims = means指定整行。“

下一个for会查看%%a中的行,并选择第{(1}})个字符组,其中tokens=2-都是分隔符。这应该选择,和' 02'来自您的数据。数字" 101"至" 148"然后将01的连接与检索到1的数字进行比较。如果匹配,则从文件中读取的行%%d将附加到%%a

处理完所有-%%d.new个文件后,.csv例程会将所有:rennew重命名为-nn.new

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

答案 2 :(得分:0)

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