我对批处理文件很新。 有人可以帮我写一个批处理脚本来解析一个看起来像这样的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)
答案 0 :(得分:2)
将一个数据转换为另一个数据的最简单方法(如月份名称转换为月份数字)使用的是array:
@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
答案 1 :(得分: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
的文件进行测试。
几乎就在那里。您的主要问题是delayed expansion
- 在块语句(a parenthesised series of statements)
中,整个块被解析,然后执行。在执行块之前,块中的任何%var%
将被解析块时的变量值替换。
因此,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
正=返回的最大长度;负=从结尾的字符中的结束位置; missing =在m
因此,由于%month%
将包含"Feb
,所需要的只是%month:~1%
- 但我保留原文。