Windows 将特定列从一个文本文件复制到另一个文本文件
我有一堆.txt文件,我想从中复制一个特定的列(从所有列)到一个.txt文件中。需要创建output.txt文件 例如Windows 将特定列从一个文本文件复制到另一个文本文件,windows,batch-file,Windows,Batch File,我有一堆.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 同样,我在windows中寻找一个批处理文件,可以帮助我实现这一点。任何形式的帮助都将不胜感激:)。我只是批处理脚本方面的新手,因此如果这听起来是一个非常基本的问题,请原谅。这可能不是您要寻找的
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
同样,我在windows中寻找一个批处理文件,可以帮助我实现这一点。任何形式的帮助都将不胜感激:)。我只是批处理脚本方面的新手,因此如果这听起来是一个非常基本的问题,请原谅。这可能不是您要寻找的答案,但在批处理文件中处理字符串时,我遇到了类似的问题,尽管不是确切的问题。我变得非常沮丧,最终学习并使用python 在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.
这会将其打印到屏幕上,从这里将其写入文件是很简单的 此批处理解决方案将从文件夹中每个文件的所有行中提取第二个字符,并将其输出到
output.txt
,哇,太好了!:)
让他们排成一行会更困难,这是严格必要的,还是可以在一个列表中,每行一个字符?编辑:不同的方法(可能更简单),这一个有另一个限制-可用变量/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
)
工作原理:
- 首先,检查将处理多少个文件。这将给出列的计数。(第一个
和用于
变量)计数
- 读取每个输入文件,修改输出请求列,使其前面的制表符数等于中间文件的行号和文件名。(第二个块由
分隔)()
- 对该文件进行排序,使连续行对应于最终输出中的连续列(
)Sort/r presorted.txt
- 使用模计数将行块转置到列中,以开始新行(最后一个
用于
块)
- 列的顺序取决于文件名的排序顺序李>
- 所有文件的行数必须相同
(第三行)必须包含实际的选项卡“tab=“
- 它采用ascii ish编码(其中
在任何可打印字符之前排序)李>tab
- 它假定没有
代码>输入中的字符(当“延迟扩展”处于启用状态时,它们需要特殊处理)
- 输出到屏幕。如果需要文件输出,请将代码放入批处理文件,然后运行
mybatchfile.bat>output.txt
out=open('C:\\output.txt','w')
将print(…
更改为文件。写入(…
并以file.close()结束)
它的好处是可读性强,并且随着您的需求的变化而易于更改。当然,我会等着看是否有人可以使用批处理脚本编写解决方案。如果没有,我将再次为您设置错误:)。非常感谢,现在我知道我有一个备份计划;)!你知道代码第2行缩进错误的原因吗。我将路径更改为file1.txt和file2.txt所在的位置,但仍然无法继续。python使用缩进来确定代码块。我改变了上面的代码,有一个额外的缩进,它应该工作现在感谢响应,但我的问题有点不同。我想将“每个文件中所有行的2个字符”放在输出文件的不同列中。希望这不是满嘴的:)对不起,刚刚意识到你想要所有的台词,我已经确定了我的答案。列输出有点复杂,我的答案会把它们放在一个列表中,我想你真的需要它们在列中吗?哈哈,不太多:)是的,为了给你一个概述,我将在一个八度脚本中使用这个txt文件,它是按照我提到的格式编码的。对于你的批处理脚本,我需要更改这个八度脚本,我不想更改,因为它有点复杂。希望你能登上不同的专栏:)好的,别担心,交给我吧,我会看看能不能想出点什么!谢谢。我感谢你的考虑:)我按照你的指示做了(尽管我不完全理解“它是如何工作的”的第二和第三个要点)。但我得到了一个txt文件,其中包含这些单独txt文件的“文件名”,并且在不同的行和列中。它在开头的几行和标签页混在一起了。我从另一篇文章中得到了这个脚本,但只有当文件有两行时,这个脚本才能正常工作。我的文件很大(确切地说是48002行)。关于如何修改它有什么想法吗?:@NeelabhGupta此代码输出到屏幕。在txt文件(presorted.txt
)中看到的只是一个中间/temp文件。我已经把如何输出到文件的附加说明。它将运行两行以上,但遗憾的是,不是48000:(-批处理文件行长度限制为~8k个字符。您的文件名(您在computing.net中提到过)也会给您带来问题,因为编号没有填充0
s,这意味着它们的排序将与您预期的不同。批处理真的是您唯一的可能性吗?即使坚持使用本机Win工具、vbscript或powershell也会更容易、更有效。好吧,那么我认为批处理不是解决问题的方法。批处理不是strict的可能性,但可能是我使用它更舒服;)。我试图使用上面发布的python代码,但它给了我第二行的缩进错误。您如何提出解决方案
@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
)