解析文本文件并编写不同的文件结构

时间:2014-08-31 23:52:00

标签: windows parsing batch-file text-files

我有这个数据库,我需要将它带入某种结构。 目前我没有LinuxOS,所以我只尝试使用Windows Batch。 原始结构有点像这样:

name=Person1
firstname=aaaa
age=00
city=bbbb
country=cccc
telephone=12345678
name=Person2
firstname=dddd
age=00
city=eeee
country=ffff
telephone=11223344
name=Person3
...

现在我需要在这样的结构中只得到这个结构的某些元素:

name,firstname,telephone
eg.:
Person1,aaaa,12345678
Person2,dddd,11223344
...

因为我对Batch不是很熟悉,所以我最终创造了一些相当“蛮力”的东西;) 通过我的代码,我得到了这样的结构:

name,firstname,telephone,name,firstname,telephone,name,...
eg.:
Person1,aaaa,12345678,Person2,dddd,11223344,Person2,...

这就是我现在被困住的地方......我的蛮力方法有很多IF条件似乎不起作用......我想知道我在推理中是否有错误,这很可能,因为正如我所说,我对Batch不是很熟悉。

好的,对不起,说够了。请看一下我生硬的丑陋代码:

@echo off
set count=1
type testfile.txt | findstr /V age | findstr /V city | findstr /V country >> work.txt
For /F "usebackq tokens=2 delims==" %%A in ("work.txt") Do @<nul set /p"=%%A,">>"work2.txt"
For /F "tokens=* delims=," %%A in (work2.txt) DO (
IF %count% EQU 1 (set name=%%A)
IF %count% EQU 2 (set fname=%%A)
IF %count% EQU 3 (set phone=%%A, set count=0)
set /a count+=1
) %name%,%fname%,%phone%>> done.txt
del work.txt, work2.txt
exit
是谁愿意帮忙?提前谢谢!

3 个答案:

答案 0 :(得分:1)

@echo off
setlocal EnableDelayedExpansion

set "telephone="
(for /F "delims=" %%a in (testfile.txt) do (
   rem Set variable with value of current line
   set "%%a"
   if defined telephone (
      echo !name!,!firstname!,!telephone!
      set "telephone="
   )
)) > done.txt

答案 1 :(得分:0)

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION 
SET "separator=,"
SET "F1="

FOR /f "tokens=1*delims==" %%a IN (q25597324.txt) DO (
 IF NOT DEFINED F1 (SET "F1=%%a"&CALL :zapflds)
 IF /i "%%a"=="!F1!" IF DEFINED $%%a CALL :report %*
 SET "$%%a=%%b"
)

CALL :report %*

GOTO :EOF

::
:: Report fields required
::
:report
IF "%1"=="" ECHO %$$:~1%&GOTO zapflds
SET "$$=%$$%%separator%"
FOR  /F "tokens=1*delims==" %%m In ('set $%1 2^>Nul') DO IF /i "%%m"=="$%1" SET "$$=%$$%%%n"
SHIFT
GOTO report

::
:: Clear fields-being-used
::
:zapflds
:: remove variables starting $
FOR  /F "delims==" %%z In ('set $ 2^>Nul') DO SET "%%z="
GOTO :eof

我使用了一个名为q25597324.txt的文件,其中包含我的测试数据。

只需运行 thisbatchname 名称,名字,电话

生成所需订单所需字段的报告。

该例程通过将f1设置为遇到的第一个字段的名称来工作(我假设该字段名的下一次出现将指示新记录。)记录该字段名称并且所有环境变量以$已被清除。

然后将每个fieldvalue分配给变量$fieldname,直到下一次出现f1。当f1 next作为字段名出现时,会生成一个报告行,并再次清除$个变量。

报告了最后一条记录,因为在最后一个字段之后没有f1

:report例程的参数只是命令行中必填字段的列表。字符串$$使用分隔符和第一个指定字段的内容构建,该字段名由shift从列表中删除并继续,直到没有剩下必填字段名。然后显示$$中构建的值(第一个字符除外),清除后自己完成所有操作!

答案 2 :(得分:0)

这解决了所述的任务:

file.txt是输入文件,输出文件是file.csv

@echo off
set "file=file.csv"
set "terms=name firstname telephone"
>"%file%" echo %terms: =,%
for /f "tokens=1,* delims==" %%a in ('findstr /i "%terms%" ^< "file.txt" ') do (
   if /i "%%a"=="telephone" (set /p =%%b<nul&echo() else (set /p =%%b,<nul)
) >> "%file%" 
pause