2012-12-20 152 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

相关问题