2014-08-31 56 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