Batch file 在特定文本上拆分CSV文件

Batch file 在特定文本上拆分CSV文件,batch-file,command-prompt,Batch File,Command Prompt,我有一个系统,可以生成包含基于时间的数据的CSV文件。 有些文件包含来自两个不同日期的数据。我想把这些文件分成两个文件,一个包含第一天的数据,另一个包含第二天的数据。原始文件如下所示: 09.01.2015 00:00:00,0385 - Veerhaven,VP01 in bedrijf hoog toerental,K,Process message. 09.01.2015 00:00:00,0385 - Veerhaven,VP01 in bedrijf laag toerental,G,

我有一个系统,可以生成包含基于时间的数据的CSV文件。 有些文件包含来自两个不同日期的数据。我想把这些文件分成两个文件,一个包含第一天的数据,另一个包含第二天的数据。原始文件如下所示:

09.01.2015 00:00:00,0385 - Veerhaven,VP01 in bedrijf hoog toerental,K,Process message.
09.01.2015 00:00:00,0385 - Veerhaven,VP01 in bedrijf laag toerental,G,Process message.
08.01.2015 23:59:55,1475 - Schaatsbaan,PO01 in bedrijf,G,Process message.
08.01.2015 23:59:52,0311 - Abraham van Stolkweg,PO01 in bedrijf,G,Process message.
前10个字符是事件的日期。我想把这个文件分成两个输出文件,将两天的数据分开。我必须使用批处理来完成这项工作,因为它必须每天对大量文件进行处理


我希望有人能在路上帮我。提前感谢。

阅读
帮助以了解如何使用
FOR
命令循环文件的行并解析其内容。那么,试试看

for /f "tokens=1,*" %%a in (timedata.txt) do (
  echo %%a ... %%b
)
您可以看到,您可以使用
%%a
按日期分割文件,这样您就可以得出如下结果

for /f "tokens=1,*" %%a in (timedata.txt) do (
  echo %%b >>timedata.%%a.txt
)
或者更一般地说

set fn=%~dpn1
set fx=%~x1
for /f "tokens=1,*" %%a in (%~1) do (
  echo %%b >>%fn%.%%a%fx%
)
@echo关闭
setlocal enableextensions disabledelayedexpansion
设置“file=c:\where\data.txt”
对于(“%file%”中的%%f,对于/f“usebackq”%%a,对于(“%%~ff”)中的%%f,执行以下操作(
如果未定义%%a(
findstr/b/c:“%%a”“%%~ff”>“%%~dpnf.%%a%%~xf”
设置“%%a=1”
)
)
第一个
for
命令仅用于检索对文件的引用,并且能够分离路径、文件名和扩展名(稍后将用于生成输出文件)

第二个
for
循环读取输入文件,对于每一行,使用空格作为分隔符检索行中的第一个标记/字段(这是
for/f
命令中的默认行为)。此值用于筛选输入文件和声明环境变量:

  • 如果未定义变量,则是第一次看到该值,将匹配记录从输入文件提取到新的输出文件,并定义变量

  • 如果定义了变量,则会看到该值并生成相应的输出文件,将跳过提取过程并继续读取下一行

编辑以适应评论

@echo关闭
setlocal enableextensions disabledelayedexpansion
设置“files=c:\where\*.txt”
设置“outputFolder=c:\where\to\put\files”
对于(“%files%”)中的%%f,请执行以下操作(
setlocal
对于(“%%~ff”)中的/f“usebackq”%%a,如果未定义,请执行%%a(
findstr/b/c:“%%a”“%%~ff”>%outputFolder%\%%~nf.%%a%%~xf”
设置“%%a=1”
)
端部
)
输入中的通配符管理不需要更改:
for%%f
迭代指定的集合,因为它只是一个文件或一组文件

输出文件夹存储在环境变量中。重定向更改为使用变量代替输入文件的路径


由于用于确定所示令牌是否已处理的变量需要为每个已处理的文件删除,处理文件内容的循环被包装在一对
setlocal/endlocal
中,该循环在处理每个文件后清理标志变量

是否也可以将其修改为与通配符和输入输出目录一起使用?我一直在试图修改它,但还没有弄明白。谢谢,谢谢。我还没有完全把它做好。它只需要一个文件就可以正常工作。它被拆分,生成的文件被重定向到输出目录。但对于多个文件,它不起作用。我甚至复制了文本文件,例如tst1.txt tst2.txt tst3.txt等等。关闭echo-off以了解发生了什么,它们都被处理了,但在输出目录中,我发现只有tst1.txt被拆分。希望你能帮助我,谢谢Cornelis@Cornelis,瞎了,我瞎了。对不起,是我的错。我忘了清理变量。请尝试更新的代码。我已经尝试过了,问题解决了!谢谢