2016-03-06 108 views
-1

我有一個分號「;」帶有「」的定界CSV文件作爲文本量化器,但是有些字段有「;」或「」打破了界限;如何使用批處理腳本在每行中的每個字段中替換這些值,但使字段分隔符(;)和文本量詞(「」)保持相同? (示例在每個字段中用「|」和雙引號單引號替換「;」)使用批處理腳本在CSV字段中搜索和替換文本

注意:我們可以依賴「;」每兩個場之間部分(開始和每個字段的結束具有雙引號,可以使用它作爲假想定界符在溶液中)

這裏作爲我的CSV行的已損壞的字段的一個示例:

"Event";"User";"Description" 
"stock_change";"[email protected]";"Change Product Teddy;Bear (Shop ID: "AR832H0823")" 
"stock_update;change";"[email protected]";"Update Product "30142_Pen" (Shop ID: GI8759)" 
+0

這不是一個問題,而是一個任務請求;請分享您迄今爲止所嘗試的內容;請記住,SO不是免費的寫作服務...... – aschipfl

回答

0
@ECHO Off 
SETLOCAL 
SET "sourcedir=U:\sourcedir" 
SET "destdir=U:\destdir" 
SET "filename1=%sourcedir%\q35828741.txt" 
SET "outfile=%destdir%\outfile.txt" 
FOR /L %%f IN (1,1,3) DO SET "field%%f=" 
(
FOR /f "usebackqdelims=" %%a IN ("%filename1%") DO (
FOR %%b IN (%%a) DO CALL :process %%b 
) 
)>"%outfile%" 

GOTO :EOF 

:process 
IF NOT DEFINED field1 SET "field1=%~1"&GOTO :EOF 
IF NOT DEFINED field2 SET "field2=%~1"&GOTO :EOF 
SET "field3=%~1" 
:repcwp 
FOR /f "tokens=1*delims=:" %%f IN ("%field3%") DO (
SET "field3=%%g" 
IF DEFINED field3 (SET "field3=%%f''%%g"&GOTO repcwp) ELSE (SET "field3=%%~f") 
) 
set "field1=%field1:;=|%" 
set "field1=%field1:"='%" 
set "field2=%field2:;=|%" 
set "field2=%field2:"='%" 
set "field3=%field3:;=|%" 
set "field3=%field3:"='%" 
ECHO "%field1:''=:%";"%field2:''=:%";"%field3:''=:%" 
FOR /L %%f IN (1,1,3) DO SET "field%%f=" 
GOTO :eof 

您需要更改sourcedirdestdir的設置以適合您的情況。

我使用了一個名爲q35828741.txt的文件,其中包含我的測試數據。

可生產定義爲%OUTFILE%

進程中的文件的每一行的文件,假定它是良好的構造。

使用簡單的for循環將三個字段傳遞給過程:過程。線各自的形式是「DATA1」 隔板「DATA2」 隔板「DATA3」

:process,數據累積到field1..3

由於共同子串替換機制使用:以分離「to」和「from」字符串,用不同的字符串''替換每個:。這隻適用於field3,因爲它從樣本數據中可以看出它是唯一可能包含冒號的字段。如果冒號可能出現在其他領域,這只是跟隨彈跳球的問題。

更換所有冒號後,根據需要替換分號和兔耳,然後在輸出數據到目標文件的echo中,用冒號替換''

這產生了一些假設,包括數據不包含%或其他尷尬的字符,並且數據中沒有::的實例。

0

我不明白你爲什麼想將teddy;bear轉換爲teddy|bear,但是......好的。

截至https://stackoverflow.com/a/35822437/1012053在評論的要求,你可以用我JREPL.BAT utility/T選項執行以下查找/替換(前面查找/替換優先):

  • "在行的開頭,或";"在任何地方,或者"在行尾==>離開爲我們
  • "其他任何地方==>轉換爲'
  • ;任何地方ELS Ë==>轉換爲|
jrepl "^\q|\q;\q|\q$ \q ;" "$& ' |" /x /t " " /f test.csv /o -