在特定文本上拆分CSV文件

时间:2015-01-13 10:05:21

标签: 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,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个字符是事件的日期。我想在两个输出文件中分解文件,分离两天的数据。我必须使用批处理来完成这项工作,因为它必须每天都在很多文件上完成。

我希望有人可以帮助我。提前谢谢。

2 个答案:

答案 0 :(得分:0)

阅读HELP FOR以了解如何使用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%
)

答案 1 :(得分:0)

@echo off
    setlocal enableextensions disabledelayedexpansion

    set "file=c:\somewhere\data.txt"

    for %%f in ("%file%") do for /f "usebackq" %%a in ("%%~ff") do (
        if not defined %%a (
            findstr /b /c:"%%a" "%%~ff" > "%%~dpnf.%%a%%~xf"
            set "%%a=1"
        )
    )

第一个for命令仅用于检索对文件的引用,并且能够分隔路径,文件名和扩展名(稍后将用于生成输出文件)。

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

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

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

已修改以适应评论

@echo off
    setlocal enableextensions disabledelayedexpansion

    set "files=c:\somewhere\*.txt"
    set "outputFolder=c:\where\to\put\files"

    for %%f in ("%files%") do (
        setlocal
        for /f "usebackq" %%a in ("%%~ff") do if not defined %%a (
            findstr /b /c:"%%a" "%%~ff" > "%outputFolder%\%%~nf.%%a%%~xf"
            set "%%a=1"
        )
        endlocal
    )

输入中的通配符管理不需要更改:for %%f遍历指定的集合,只是一个文件或一组文件。

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

由于用于确定是否已处理指示的令牌的变量需要为每个处理的文件删除,处理文件内容的循环包含在一对setlocal/endlocal中,每个{...}}清除标志变量。文件已处理