2014-08-31 53 views
0

我有这个数据库,我需要把它带入一个特定的结构。 目前我没有LinuxOS,所以我只尝试使用Windows批处理。 原始的结构去有点像这样:解析一个文本文件并写入不同的文件结构

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 
... 

因为我可不是很熟悉批我结束了创建东西,而“蛮力”) 我的代码我来的地步,我得到这样的结构:

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

这就是我现在坚持的地方......我的很多IF条件的强力方法似乎不起作用......我不知道在推理中是否有错误,这是因为正如我所说的,我可能不太熟悉批处理。

好吧,对不起,说够了。请看看我的钝和难看的代码:

@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 

任何人愿意帮忙吗?提前致谢!

回答

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设置为遇到的第一个字段的名称(我认为该字段名的下一次出现将指示新记录)。将记录该字段名并清除以$开头的所有环境变量。

然后将每个字段值分配给变量$fieldname,直到下一次出现f1。当f1下一个显示为字段名称时,将生成一个报告行并重新清除$变量。

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

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

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 
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 
+0

+1这是非常聪明的 - 它只是需要写得太标题行。 – foxidrive 2014-09-02 07:29:13

相关问题