情景:最近喵仙子有个需求,需要抽取日志文件中的有效信息到excel,刚开始我用MapReduce给他做了一份,不过他有点蠢配不了环境,于是乎我研究了下bat,终于给他整了个好方法,请看下文。

需求
需要从log中抽取两列数据到excel中。

本西芙没了解过bat语法,所以查了一下,通过结合这两篇解答完成bat命令。
1、实现了按照空格批处理分割txt数据,存储excel
https://zhidao.baidu.com/question/1770548208106936980.html

1
2
3
4
5
6
7
8
9
10
11
12
@echo off
rem 保存为bat文件跟txt文件放一起运行
md "结果\" 2>nul
for /f "delims=" %%a in ('dir /a-d/b *.txt') do (
setlocal EnableDelayedExpansion
(for /f "delims=" %%b in ('type "%%a"') do (
set "str=%%b"
echo;!str: =,!
))>"结果\%%~na.csv"
Endlocal
)
pause

2、批处理分割字符串
https://blog.csdn.net/zhju85126com/article/details/46649961

1
2
3
4
5
6
7
8
9
10
11
12
@echo off
set str=100x200x300y400y500x600y700
for /f "tokens=1,3-5,* delims=x|y" %%a in ("%str%") do (
set c1=%%a
set c3=%%b
set c4=%%c
set c5=%%d
set c6=%%e
)
echo %c1%, %c3%, %c4%, %c5%, %c6%
pause
rem 输出结果为输出结果为:100, 300, 400, 500, 600y700。其中tokens=1,3-5,*表示提取第1、3至5列,同时把第5列后所有剩余字符串作为第6列,一个输出了5个变量,也可以写作tokens=1,3,4,5,*。

最终我所加工的代码,其中代码中tokens=1,2是按照_空格分割的位置,相当于数组的某一元素、把它赋值给str1

1
2
3
4
5
6
7
8
9
10
11
12
13
@echo off
md "结果\" 2>nul
rem 循环数据
for /f "delims=" %%a in ('dir /a-d/b *.log') do (
setlocal EnableDelayedExpansion
rem 切割方式
(for /f "tokens=1,2 delims=_| " %%b in ('type "%%a"') do (
set "str1=%%b %%c"
echo;!str1: =,!
))>"结果\%%~na.csv"
Endlocal
)
pause

首先根据第一篇解答套入转excel模板,其次根据第二篇解答对bat for循环中分割和选取的描述,修改第五行代码。可以实现。

演示

  • 文件内容
    文件内容
    文件内容
  • 目录下的文件
    目录下的文件
    目录下的文件
    2、点击aa.bat,生成csv文件
    生成csv文件
    生成csv文件
    3、任意打开一个csv文件
    csv文件内容
    csv文件内容