我希望创建一个.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
答案 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
代码传递到项目中。