2012-12-20 146 views
4

我有一堆.txt文件,我想從中複製一個特定列(從所有這些文件)到一個.txt文件。需要創建output.txt文件從一個文本文件複製一個特定的列到另一個

例如,

file1.txt 
a b c 
j k l 

file2.txt 
d e f 
m n o 

file3.txt 
g h i 
p q r 

output.txt 
b e h 
k n q 

出於同樣的,我在窗口,可以幫助我實現這個尋找一個批處理文件。任何形式的幫助將非常感激 :)。如果這聽起來是一個非常基本的問題,我只是批量編寫腳本的新手,因此請原諒我。

回答

1

這可能不是你要找的答案,但在批處理文件字符串時我有一個類似但不準確的問題。我變得非常沮喪,最終學習和使用python。

for i in range(1,4): 
    f='c:\\file'+str(i)+'.txt' # Creates a variable for file1.txt, file2.txt formatted as c:\file1.txt. Path can be changed as needed. 
    f = open(f) # Opens the file 
    string=f.read() # Adds the contents of the file to a string 
    print(string.split('\t')[1]+'\t'+string.split('\t')[4]) # splits the string by tabs, and returns the 2nd and 5th item. 

此打印出來到屏幕上,寫出來的文件是從這裏簡單:

在Python,因爲這將是簡單。

+1

Thanks @multiphrenic。只是爲了澄清:我的txt文件中的列值是浮點數,所有列都是製表符分隔的! –

+0

上面的代碼應該可以工作,如果你願意使用python。把它寫到一個文件中就像添加下面這樣簡單: 'out = open('C:\\ output.txt','w')' 'print(...'to'file.write ...' 並用'file.close()' 完成,這樣做的好處是它的可讀性和容易隨着您的需求變化而改變。 – pedram

+1

當然,我會等待看看有沒有人可以用解決方法是使用批處理腳本,如果沒有,我會再次bug你:)。非常感謝,現在我知道我有一個備份計劃;)! –

1

這個批處理解決方案將採取第二個字符從所有從每個文件的文件夾,並將其輸出的線output.txt,哇,這是一個一口! :)

for %%a in (file*.txt) do (
for /f "tokens=2 delims= " %%b in (%%a) do echo %%b >>output.txt 
) 

讓他們排隊會更困難,是嚴格必要的,或者他們可以在列表中,每行一個字符?

+0

感謝您的迴應,但我的問題有點不同。我想把'每個文件中所有行的2個字符'放在輸出文件的不同列中。希望這不是一口滿:) –

+0

對不起,剛纔意識到你想要所有的線,我已經解決了我的答案。列輸出有點棘手,atm我的答案會把他們放在一個列表中,我認爲你真的需要他們在列中?哈哈沒有這麼多:) –

+0

是的,給你一個概述我打算在一個OCTAVE腳本中使用這個txt文件,這個腳本被編碼爲我提到的格式。與您的批處理腳本我需要改變這個OCTAVE腳本,我不想作爲它有點複雜。希望你可以把它做成不同的列:) –

0

編輯:不同的方式這樣做(可能更直接),這一個有另一個限制 - 可用變量/ env的大小。空間(XP時約32kB,不限Vista) - 至少每個MS文檔)。它創建了一個一種數組變量來保存你的換位線,然後將它們輸出:

@echo off 
setlocal enabledelayedexpansion 

set "tab= " 

for %%F in (file*.txt) do (
    set /a count=0 
    for /f "tokens=2 delims=%tab%" %%L in (%%F) do (
    set /a count+=1 
    for /L %%T in (!count!,1,!count!) do (
     set L[!count!]=!L[%%T]!%%L%tab% 
    ) 
) 
) 
for /L %%L in (1,1,%count%) do echo !L[%%L]! 

首先,讓我說,batch是不是最適合這個任務(這將一直微不足道,說在C),但是如果你要使用它,這裏是一個辦法:


    @echo off 
    setlocal enabledelayedexpansion 
    set "tab= " 

    for /f %%C in ('dir /b file*.txt') do set /a count+=1 

    (for %%F in (file*.txt) do (
     set line=0 
     for /f "tokens=2 delims=%tab%" %%V in (%%F) do (
     set "outline=%%F" 
     for /l %%N in (1,1,!line!) do (set "outline=%tab%!outline!") 
     set outline=!outline!%tab%%%V 
     set /a line+=1 
     echo !outline! 
    ) 

    )) >presorted.txt 

    set /a cutoff=%count%-1 

    set line=0 
    for /f "tokens=2 delims=%tab%" %%O in ('sort /r presorted.txt') do (
     set outp=%%O%tab%!outp! 
     set /a lc=!line!^%%count% 
     if !lc!==%cutoff% (
     echo !outp! 
     set "outp=" 
    ) 
     set /a line+=1 
    ) 

工作原理:

  • 拳,檢查有馬ny文件將被處理。這給列的數量。 (初forcount可變)
  • 閱讀改性每個輸入文件,輸出請求的列,以便它將由製表符等於行號和文件名,以中間文件的數目之前。 (由()分隔第二塊)
  • 排序此文件中,以便連續行對應於連續列在最終輸出(sort /r presorted.txt)線的
  • 移調塊分成使用modulo count開始新線(最後for塊)

備註:

  • 列的順序取決於文件名的排序順序。
  • 所有文件都必須具有相同的行數
  • "tab= "(在第3行)必須包含實際的製表
  • 它假定ASCII上下的編碼(其中前tab各種各樣的任何可打印字符)。
  • 它假設沒有!字符輸入(當延遲擴展時,它們需要特殊處理)
  • 輸出到屏幕。如果需要文件輸出,將代碼放入批處理文件中,然後運行mybatchfile.bat >output.txt
+0

我遵循了你的指示(雖然我不完全理解'它是如何工作'的第二和第三顆子彈)。但是我得到一個txt文件,其中包含這些單獨的txt文件的「文件名」,並且與不同列中的行不同。它在一開始就混雜在一些標籤上。 –

+0

我從另一篇文章中得到了這個腳本,但是這隻有在文件有2行時才能正常工作。我的文件很大(準確地說是48002行)。任何想法如何修改它?:http://www.computing.net/answers/programming/copying-a-specific-column-from-one-text-file-to-another/28745.html –

+0

@NeelabhGupta這代碼輸出到屏幕。你在txt文件中看到的('presorted.txt')只是一箇中間/臨時文件。我已經把addtional注意如何輸出到文件。它會運行超過兩行,但可悲的是,不是48000 :( - 批處理文件行長度在〜8K字符是限制。你的文件名(你在computing.net提到)也會給你帶來問題,因爲編號不是用'0'填充,這意味着它們的排序方式與你期望的不同。批處理是否是唯一的可能性?即使堅持原生Win工具,vbscript或powershell也會更容易,更有效。 – wmz

相關問題