2015-09-05 52 views
1

我有導出iTunes選擇列表的文本文件,它們是製表符分隔的數組。他們有27列,但爲了簡單起見,我只在示例中包括四個:批處理腳本逐行讀取一個製表符分隔的文本文件並將一列提取到一個新文件

Name Artist My Rating Location 
Pod1 Show1 0   E:\Podcasts\Show1\Episode99.m4a 
Pod2 Show2 100   E:\Podcasts\Show2\Show2 Ep 101 - Subtitle.mp3 
Pod3 Show2 60   E:\Podcasts\Show2\News 11-17-2014.aicc 

依此類推。我需要只提取位置(這始終是最後一列),並將其放置在一個新的文本文件,所以它看起來是這樣的:

E:\Podcasts\Show1\Episode99.m4a 
E:\Podcasts\Show2\Show2 Ep 101 - Subtitle.mp3 
E:\Podcasts\Show2\News 11-17-2014.aicc 

這裏是我到目前爲止所實現這一目標的代碼:

@ECHO OFF 

type Podcasts.txt | findstr /v Grouping > Podcasts1.txt 
del Podcasts.txt 
rename Podcasts1.txt Podcasts.txt 

雖然我已經找到了一些關於修改單行和逐行讀取文本文件的單獨教程,但我一直很難按照自己喜歡的方式修改單行,更不用說合並兩個原則了。我想這可能是一個非常快速的答案,我只是沒有找到正確的搜索。

我發現,它可能使用下面的正則表達式來得到我想要的結果,在記事本++:

Find: .+(E\:) 
Replace: \1 

所以一個辦法做到這一點一行一行在批處理腳本將是有益的。

加分:我使用生成的文件作爲白名單來刪除不在播放列表中的文件。如果你有一個鏈接或者可以寫一段代碼,那會有幫助。否則,我有關於如何計劃完成這個需要使用單個文件夾的想法。

編輯:我發現,因爲有些列是空白的,使用此:

for /f "usebackq tokens=1-26,* delims= " %%a in ("Podcasts.txt") do (
    echo %%q >> PodcastsTest.txt 
) 

有時會按錯列。我需要一些可以搜索兩個字符「E:」的東西,然後從那裏開始行動,或者行搜索從右向左找到第一個標籤。

我剛剛創建的快速和骯髒的方法,對於一個反斜槓搜索(目前僅出現在位置)如下:

for /f "usebackq tokens=1,* delims=\" %%a in ("Podcasts.txt") do (
    echo E:\%%b >> PodcastsTest.txt 
) 

這不是一個安全的方法,因爲沒有什麼能阻止從其他領域有反斜槓,但作爲臨時解決方案,它的工作原理。我發現Linux SED is available for Windows。也許有一種方法可以適應以下Notepad ++ REGEX搜索嗎?

Find: .+(E\:) 
Replace: \1 
+0

可能的副本[複製.csv中的列文件到另一個使用批次](http://stackoverflow.com/questions/22334682/copy-a-column-in-a-csv-file-to-another-using-batch)和其他人發現與[\ [batch-文件\] csv複製列](http://stackoverflow.com/search?q=%5Bbatch-file%5D+csv+copy+column)。在批處理文件中的'delims ='水平製表符後面指定,__FOR__默認情況下僅通過製表符而不是空格和製表符分隔字段值。在命令提示符窗口中運行'for /?'並讀取所有輸出幫助頁面以獲取此命令的詳細信息。 – Mofi

回答

2

這是基於源數據和問題增加了額外信息的限制的新的解決方案,以及驗收到使用另一種工具:

call jrepl ".*(E:.*)" "$1" /i /f "Podcasts.txt" /o "Podcasts2.txt" 

上面的代碼使用了原生的Windows批處理腳本調用Jrepl.bat(由dbenham)
jrepl.bat可以從以下網址下載:https://www.dropbox.com/s/4otci4d4s8x5ni4/Jrepl.bat
,它也可以在這裏找到:http://www.dostips.com/forum/viewtopic.php?f=3&t=6044

將其放在與批處理文件相同的文件夾中或位於系統路徑中的文件夾中。

第2部分

下面的代碼然後可以用來生成其中列出在當前文件夾中的所有文件中,不是從上述jrepl代碼生成的文件中的一個文件。

您提到了單個文件夾 - 這就是它處理的內容以及在使用文件覈對文件之前可以檢查文件。

實際上,這可以與原始源文件一起使用 - 如果文件名只在文件內出現一次。

@echo off 
(
for %%a in (*.*) do (
    if /i not "%%~nxa"=="%~nx0" if /i not "%%~nxa"=="Podcasts2.txt" find /i "\%%~nxa" < "Podcasts2.txt" >nul || echo del "%%a" 
) 
)>delfiles.bat.txt" 

下面是一個數據的製表符分隔的文件

鹼性溶液中的所有細胞,而不該文件我不能肯定它有正確的列,但該技術應該工作。

在不將TAB轉換爲空格的編輯器(如「記事本」)中,使用文本製表符替換TAB。

@echo off 
for /f "usebackq tokens=1-26,* delims=TAB" %%a in ("Podcasts.txt") do (
    echo %%b 
) 
pause 
+0

這是一個很好的開始,導致了一個不安全的修復。我編輯了這個問題,將我的問題納入其中。 –

+0

@LawrencePell這個答案有一個新部分 – foxidrive

2

這裏是一個純批量溶液,依賴於這樣的假設上的所需位置總是與E:\開始(不區分大小寫),並且必須在任何早先列不會發生串:

@echo off 
setlocal disableDelayedExpansion 
>"Podcasts.txt.new" (
    for /f "usebackq skip=1 delims=" %%A in ("Podcasts.txt") do (
    set "ln=%%A" 
    setlocal enableDelayedExpansion 
    echo !ln:*E:\=E:\! 
    endlocal 
) 
) 

如果您知道沒有位置包含!,那麼您可以簡單地在頂部啓用延遲擴展,並從循環中移除SETLOCAL和ENDLOCAL。

正則表達式是獲取最後一列的好方法,無論內容如何。批處理的一個好的正則表達式實用程序是JREPL.BAT - 純粹的基於腳本的實用程序(混合JScript /批處理),可以在任何Windows機器上從本機運行,從XP開始。

以下JREPL一個襯墊效果很好:

jrepl "[^\t]+$" $0 /jmatch /jbegln "skip=(ln==1)" /f "Podcasts.txt" /o "Podcasts.txt.new" 

這裏是另一個JREPL解決方案:

jrepl ".*\t" "" /a /jbegln "skip=(ln==1)" /f "Podcasts.txt" /o "Podcasts.txt.new" 

注意 - 如果您使用批處理腳本中要麼JREPL解決方案,您必須使用CALL JREPL。

這最後的正則表達式可以通過使用與sed的:與SED和幾個假設

sed "1d;s/.*\t//" "Podcasts.txt" >"Podcasts.txt.new" 
+0

編輯 - 修正了跳過第一行(標題行)的兩種解決方案。還修復了JREPL解決方案,以便不在這些位置之間打印空行。 – dbenham

+0

編輯2 - 增加了另一個JREPL選項,以及使用相同正則表達式的sed解決方案。 – dbenham

1

PathTocygwin/sed -e '\#.*[[:blank:]]\([A-Z]:/.*$# !d' -e 's//\1/' Podcasts.txt > Podcasts1.txt 
del Podcasts.txt 
rename Podcasts1.txt Podcasts.txt 

這裏假定 - 路徑使用映射驅動器 - 沒有以前路徑在1到25列中 - 只保留對應於該模式的行

相關問題