2014-02-22 40 views
0

我期待创建一个.cmd文件,该文件可以筛选文件夹中的所有.csv文件,然后使用结果创建一组.csv文件。筛选csv文件并使用数据创建一组.csv文件

这是场景。

有一个文件夹中的许多文件中的.csv
数据的CSV文件中的第一列包含一个代码HH??????-XX, 其中??????可能是从01 to 48

任何一组数字和XX范围我想批处理文件以01开始XX何HH??????-01找到需要的行并将结果放置在名为输出文件-01.csv

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

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

然后整个过程重复HH??????-02和文件名为-02.csv CSV输出等多达高达-48.csv

我没有很多 - 我不是这方面的专家,在所有的,只是在VBA

我从网上获得了这个模板,我认为我可以改进,但我并不真正了解如何适应这一点。我不熟悉的for循环在.csv文件

@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 

示例行是:(记住,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 
+0

我相信从文件中一些实际的例子,将有助于人们理解的要求(所有'*'S和'XX's是有点混乱)。另外,你到目前为止还有什么?你熟悉'FOR'循环吗? – mbroshi

+0

@mbroshi感谢您的回复我已更新我的帖子,以获取更多信息 – Ingram

回答

0
编辑

:添加一个target folder和cd命令用于source folder

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

@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 
+0

您究竟做了这个foxidrive,这绝对是太棒了!我在哪里可以学到这个? – Ingram

+0

我最大最热烈的感谢您的帮助!!!!! – Ingram

+0

我可以问一个更多的问题..我如何瞄准一个particualr文件夹和输出文件到另一个文件夹? – Ingram

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 - 没有明确的规范,我们启动一个猜谜游戏。

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

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

然后%%a接收从文件%%f每一行。该“有usebackq is required because %%˚Fis quoted (in case of spaces in filenames). The跳过= 1个means skip the first line (because it's a header) and the delims = means分配整个line`。

接下来for着眼于%%a线和选择第二(tokens=2)字符组,其中-,均为分隔符。这应该从你的数据选择01和“02”。数字“101”到“148”,然后用1与检索到%%d数量的级联进行比较。当有一个比赛,该行%%a被读取从文件中将附加到-%%d.new

当所有.csv文件已被处理时,:rennew程序重命名所有的-nn.new-nn.csv的。

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

+0

这似乎不起作用,它创建具有创建名称的csv文件并将标题放入每个文件中,但它不会将数据放入csv中。 Foxi的方法效果很好。不过,我感谢你付出努力帮助:D我们可以看看它为什么不起作用? – Ingram

+0

你确实已经把'q21956251 * .csv'改成'* .csv'了吗? – Magoo

+0

哈哈,不!让我再尝试一次! – Ingram

0

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