2014-10-09 83 views
0

我書面方式腳本在Windows中,.bat文件,以取代:BAT文件替換字符串中的兩行

注意,有一個回車,我指的是字符串是兩行。現在看起來更復雜:2個引號後有2個空格,然後按「ENTER」

"" 
"2014 

所以,這樣的:(雙引號)(雙引號)(空間)(空間)(換行符)(雙引號)2014

我遇到問題了。這是腳本的樣子:

@echo off 
setlocal enabledelayedexpansion 
set INTEXTFILE=FILE_IN_CSV.csv 
set OUTTEXTFILE=222.csv 
set SEARCHTEXT=^"^"^"2014 
set REPLACETEXT=^"^"^"4 
set OUTPUTLINE= 

for /f "tokens=1,* delims=¶" %%A in ('"type %INTEXTFILE%"') do (
    SET string=%%A 
    SET modified=!string:%SEARCHTEXT%=%REPLACETEXT%! 

    echo !modified! >> %OUTTEXTFILE% 
) 
del %INTEXTFILE% 
rename %OUTTEXTFILE% %INTEXTFILE% 

任何想法?

謝謝!

編輯:添加源文本示例。看到每行末尾有3個(不是2!)黑色空格。

"2014091810000076";"Question about folder sizes";"2014-09-18 12:10:20";"2014-09-25 17:33:15";"Resolt Sistemes";"jbgsfnam";"Sistemes::Altres";"STFD";"peticions";"" 
"2014091910000109";"Error opening word files with office 2013";"2014-09-19 09:50:07";"2014-09-25 14:27:59";"Resolt TRO";"yerttom";"Qualitat::Altres";"STFD";"peticions";"" 

我只需要刪除每行開頭的20,而不是行中間的其他20。

+0

所以你有問題嗎?謹慎處理? – ths 2014-10-10 19:28:56

+0

嗨,我只是添加一些源文本作爲例子。謝謝! – user3139207 2014-10-15 07:24:23

回答

0
@ECHO OFF 
SETLOCAL 
(
FOR /f "delims=" %%a IN (q6288377.txt) DO (
SET line=%%a 
SETLOCAL ENABLEDELAYEDEXPANSION 
ECHO(^"!line:~3! 
endlocal 
) 
)>newfile.txt 
(
FOR /f "delims=" %%a IN (q6288377.txt) DO (
SET line=%%a 
SETLOCAL ENABLEDELAYEDEXPANSION 
IF "!line:~1,2!"=="20" (ECHO(^"!line:~3!) else (echo(%%a) 
endlocal 
) 
)>newfile2.txt 

GOTO :EOF 

如果沒有明確的預期結果的明確指示,解決稱爲「我的代碼沒有做我想做的事」的問題是非常困難的。

你的問題似乎是刪除文本文件第2和第3列中的「20」(我改變了名稱以適合我的系統。)

上面的代碼假設行的文件開始"。第一部分任意刪除第2列和第3列中的任何字符,創建newfile.txt。第二個僅選擇第2列和第3列中具有20的行並刪除這些列,僅留下其他行並創建newfile2.txt

您已更改從要求「」 空間空間換行符「2014年3端子空間,第一行是否是一個異常無指示(它不會因‘’空間前面空間換行),因此上述可能不適用。不知道序列的存在是否顯着 - 很可能像sed這樣的實用程序更適合該任務(Google是您的朋友)


[編輯延長的問題]

@ECHO OFF 
SETLOCAL 
SET "sourcedir=U:\sourcedir" 
PUSHD "%sourcedir%" 
FOR %%u IN (q6288377*.txt) DO (
(
FOR /f "usebackqdelims=" %%a IN ("%%u") DO (
SET line=%%a 
SETLOCAL ENABLEDELAYEDEXPANSION 
ECHO(^"!line:~3! 
endlocal 
) 
)>%%~nu.xtx 
) 
popd 

GOTO :EOF 

你需要改變的sourcedir設置,以滿足您的具體情況。產生的文件將是同名 .xtx。不要試圖直接覆蓋現有的文件。

你也可以在目錄名前面加上%%~nu.xtx來創建新文件,例如「c:\ some random \ directory \ %%〜nu.xtx」 - 「用引號括起來」,如果目錄或文件名包含分隔符(如空格)。該~nu的意思是「%%u的名字 - 見爲/從提示的更多信息

它總是更容易解決,而不是零敲碎打它的整個問題的完整描述可能影響使用的方法

?。
+0

此代碼運行完美,謝謝! 讓我問你1最後一個問題:是否可以修改此腳本以將其應用於文件夾中的所有CSV文件? – user3139207 2014-10-15 08:56:52

0

您的方法無法工作。

  1. 命令for總是逐行處理文本。因此,不可能將2行作爲字符串獲取到環境變量中並修改此字符串。

  2. 段落符號(代碼值B6十六進制)只是在查看文本文件時顯示行尾的佔位符。 CSV文件包含回車符(0D)和換行符(0A),其中for命令始終將解釋爲與您指定的內容無關的分隔符。

最好是使用文本編輯器如UltraEdit或Notepad ++或Sublime Text在文件中進行替換。甚至沒有必要在這些編輯器中運行正則表達式替換。但是使用Perl正則表達式""\s+"2014作爲搜索字符串並替換字符串"""4會導致您想要的修改。

還有用於替換文件中的字符串的控制檯應用程序。看看How can you find and replace text in a file using the Windows command-line environment?

使用下面的代碼,仍然可以使用僅使用標準命令搜索"" \r\n"2014並將其替換爲"""4

@echo off 
setlocal EnableDelayedExpansion 
set "INTEXTFILE=FILE_IN_CSV.csv" 

if not exist "%INTEXTFILE%" goto EndBatch 

set "OUTTEXTFILE=%TEMP%\csv_replace.tmp" 
if exist "%OUTTEXTFILE%" del "%OUTTEXTFILE%" 

set "FirstLine=" 
set "EndFirstLine="" " 
set "BeginSecondLine="2014" 

for /f "usebackq delims=" %%A in ("%INTEXTFILE%") do (
    set "Line=%%A" 
    if not "!FirstLine!"=="" (
     if "!Line:~0,5!"=="!BeginSecondLine!" (
      set "FirstLine=!FirstLine!"!Line:~4!" 
      echo !FirstLine!>>"%OUTTEXTFILE%" 
      set "Line=" 
     ) else (
      echo !FirstLine! >>"%OUTTEXTFILE%" 
     ) 
     set "FirstLine=" 
    ) 
    if not "!Line!"=="" (
     if "!Line:~-4!"=="!EndFirstLine!" (
      set "FirstLine=!Line:~0,-2!" 
     ) else (
      echo !Line!>>"%OUTTEXTFILE%" 
     ) 
    ) 
) 

if exist "%OUTTEXTFILE%" (
    copy "%OUTTEXTFILE%" "%INTEXTFILE%" >nul 
    del "%OUTTEXTFILE%" 
) 

:EndBatch 
endlocal 

空行也被這個批處理文件刪除。這是無法避免的,因爲命令for在分析文件時會忽略空行。

+0

這個腳本不適用於我。我編輯了一個代碼示例的初始文章。謝謝! – user3139207 2014-10-15 07:06:56

+0

所以你只是想修剪尾部空格,並刪除所有行中的第二和第三個字符(世紀),這與最初描述的完全不同。 t,CSV文件中的字段值中存在換行符,因此在某些情況下,需要將兩行連接到單行。所以我爲真正需要的東西寫了一個完全錯誤的代碼。輸入和輸出示例總是最適合描述這些任務。 – Mofi 2014-10-15 16:01:20

+0

是的,你是對的。我忘記發佈一個源文本的例子。 – user3139207 2014-10-16 06:09:13