根据特定文本拆分 CSV 文件
Splitting CSV files on specific text
我有一个系统可以生成包含基于时间的数据的 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个字符是事件的日期。我想将该文件分解为两个输出文件,将这两天的数据分开。我必须使用批处理来执行此操作,因为它必须每天处理大量文件。
我希望有人能在我的路上帮助我。提前致谢。
阅读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%
)
@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
循环读取输入文件,并为每一行检索行中的第一个 token/field 使用空格作为分隔符(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
中在处理完每个文件后
我有一个系统可以生成包含基于时间的数据的 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个字符是事件的日期。我想将该文件分解为两个输出文件,将这两天的数据分开。我必须使用批处理来执行此操作,因为它必须每天处理大量文件。
我希望有人能在我的路上帮助我。提前致谢。
阅读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%
)
@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
循环读取输入文件,并为每一行检索行中的第一个 token/field 使用空格作为分隔符(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
中在处理完每个文件后