如何使用批处理脚本解析CSV文件?

3

我是一名批处理文件新手。 请问是否能帮我编写一个批处理脚本,用于解析以下格式的csv文件:

"Expert Info (Chat/Sequence): GET /?password=Katy HTTP/1.1\r\n","Feb 20, 2014 19:34:46.571807000","b5:54:f4:v7:xo:6l"

"Expert Info (Chat/Sequence): GET /?password=Cory HTTP/1.1\r\n","Feb 20, 2014 19:34:51.671167000","b5:54:f4:v7:xo:6l"

"Expert Info (Chat/Sequence): GET /?password=Mike HTTP/1.1\r\n","Feb 20, 2014 19:34:57.145898000","b5:54:f4:v7:xo:6l"

并将其转换为另一个看起来像这样的csv文件:
"Katy", "2014-02-20", "19:34:46", "b5:54:f4:v7:xo:6l" 
"Cory", "2014-02-20", "19:34:51", "b5:54:f4:v7:xo:6l" 
"Mike", "2014-02-20", "19:34:57", "b5:54:f4:v7:xo:6l"

以下是我写的内容:

@echo off
FOR /F "tokens=6,8,9,10,11* delims=,? " %%a in (file.csv) do (

set pass=%%a
set month=%%b
set day=%%c
set year=%%d
set sec=%%e
set mac=%%f
echo "%%a" %%b %%c %%d %%e %%f

if %month:~1,10%==Jan set month=01
if %month:~1,10%==Feb set month=02
if %month:~1,10%==Mar set month=03
if %month:~1,10%==Apr set month=04
if %month:~1,10%==May set month=05
if %month:~1,10%==Jun set month=06
if %month:~1,10%==Jul set month=07
if %month:~1,10%==Aug set month=08
if %month:~1,10%==Sep set month=09
if %month:~1,10%==Oct set month=10
if %month:~1,10%==Nov set month=11
if %month:~1,10%==Dec set month=12

echo "%pass:~9,4%", "%year%-%month:~1,10%-%day%", "%sec:~,8%", %mac% >> text.csv)

1
看一下 for 命令 - 特别是使用 /f 开关。你应该在这里发布你遇到的问题,而不是问题本身。 - unclemeat
抱歉,刚刚添加了我的代码。 - dave
2个回答

2

将一个数据转换为另一个数据的最简单方法,例如将月份名称转换为月份数字,是使用数组

@echo off
setlocal EnableDelayedExpansion

rem Create the conversion array of month names to month numbers
set m=100
for %%a in (Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec) do (
   set /A m+=1
   set month["%%a]=!m:~1!
)

(for /F "tokens=6,9,10,11,12,14 delims==,. " %%a in (file.csv) do (
   echo "%%a", "%%d-!month[%%b]!-%%c", "%%e", %%f
)) > text.csv

2
@ECHO OFF
SETLOCAL
(
FOR /F "tokens=6,8,9,10,11* delims=,? " %%a in (q21921051.txt) do (
 set pass=%%a
 set month=%%b
 set day=%%c
 set year=%%d
 set sec=%%e
 set mac=%%f
 CALL :CALC
)
)> text.csv
GOTO :EOF
:calc

if %month:~1,10%==Jan set month=01
if %month:~1,10%==Feb set month=02
if %month:~1,10%==Mar set month=03
if %month:~1,10%==Apr set month=04
if %month:~1,10%==May set month=05
if %month:~1,10%==Jun set month=06
if %month:~1,10%==Jul set month=07
if %month:~1,10%==Aug set month=08
if %month:~1,10%==Sep set month=09
if %month:~1,10%==Oct set month=10
if %month:~1,10%==Nov set month=11
if %month:~1,10%==Dec set month=12

echo "%pass:~9,4%", "%year%-%month%-%day%", "%sec:~,8%", %mac%

GOTO :eof

我使用了一个名为q21921051.txt的文件进行测试。

就快完成了。你的主要问题在于延迟扩展——在块语句(一系列括号内的语句)中,整个块都会被解析,然后执行。块内的任何%变量%都将被替换为该变量在解析块之前的值-在执行块之前。

因此,IF (something) else (somethingelse)将使用%variables%的值在遇到IF时执行-同样适用于FOR ... DO (block)

克服这种情况的两种常见方法是1)使用setlocal enabledelayedexpansion并使用!var!代替%var%来访问更改后的var值,或者2)调用子程序以使用更改后的值执行进一步处理。

我在这里使用了第二种方法

还要注意,(将整个例程括起来)将使用重定向器重定向其所有输出-在本例中是>text.csv。如果您希望附加而不是新建文件,则>应为>>

我不确定%month:~1,10%的迷恋是什么。在批处理中,子字符串是从%var:~m,n%获得的,其中,n是可选的;m是从字符串开头计数的字符数,如果是负数,则从末尾计数。正,n =返回要返回的最大长度;负=从结尾处的字符位置;缺失=返回m之后的所有内容。

因此,由于%month%将包含"Feb,所以只需要%month:~1%-但我保留了您的原始值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接