Windows 批处理 - 将多个文本文件连接成一个

Posted

技术标签:

【中文标题】Windows 批处理 - 将多个文本文件连接成一个【英文标题】:Windows batch - concatenate multiple text files into one 【发布时间】:2015-08-08 14:11:29 【问题描述】:

我需要创建一个脚本,将多个文本文件合并为一个。 我知道它很容易使用

type *.txt > merged.txt

但要求是“将同一天的文件连接到文件 day_YYYY-DD-MM.txt”我是 Linux 用户,Windows 批处理对我来说是地狱。它是 Windows XP。

【问题讨论】:

您应该告诉我们是否需要在“真实”批处理文件中完成,或者是否可以使用 powershell / Windows 脚本主机。对于初学者,您应该提及需要支持哪个 Windows 版本(最低/最高) 它的 windows XP 所以没有 powershell 您将需要一个可爱的 FOR 命令来执行此操作:***.com/questions/9234207/…。就个人而言,我不会批量处理这样的事情。即使你可以让它工作,你可以使用的对象类型也是有限的——Powershell 是要走的路。 您可以在 Windows XP 上安装 Powershell 2.0。见support.microsoft.com/en-us/kb/968929 我没有推荐 cygwin,因为我认为你想要一个最小的模糊解决方案。您的问题标题表明您需要基于 Windows 机制的解决方案。 【参考方案1】:

在最基本的情况下,从批处理文件中连接文件是通过“复制”完成的。

copy file1.txt + file2.txt + file3.txt concattedfile.txt

【讨论】:

我尝试复制 *.xyz all.bin 但生成的文件 all.bin 仅包含该目录中 xyz 文件的子集。我不明白为什么它没有包括所有这些。加号语法是必要的吗?如果是这样的话,对于大量文件来说是不方便的。 我刚刚根据您的规范创建了一个示例,它的行为符合预期。我创建了“1.xyz”、“2.xyz”和“3.xyz”。然后运行“copy *.xyz all.bin”,生成的“all.bin”包含所有 3 个文件的内容。所以我不知道为什么它不适合你。 感谢您对此进行测试。我将不得不进一步尝试找出原因! 您还应该提到“/b”(二进制)运算符。将它与文本文件一起使用还会将每个文件的 BOM 标头(例如 UTF8+BOM、UCS2+BOM)复制在一起,并在以后产生大量复杂性...... 这在大文件上比接受的答案要快得多【参考方案2】:

试试这个:

@echo off
set yyyy=%date:~6,4%
set mm=%date:~3,2%
set dd=%date:~0,2%

set /p temp= "Enter the name of text file: "
FOR /F "tokens=* delims=" %%x in (texto1.txt, texto2.txt, texto3.txt) DO echo %%x >> day_%temp%.txt

此代码要求您在“day_”之后设置文件名,您可以在其中输入日期。 如果您想将文件命名为实际日期,您可以这样做:

FOR /F "tokens=* delims=" %%x in (texto1.txt, texto2.txt, texto3.txt) DO echo %%x >> day_%yyyy%-%mm%-%dd%.txt

【讨论】:

您的回答结果取决于系统的本地设置。【参考方案3】:

我们可以使用普通的 CAT 命令来合并文件..

D:> cat *.csv > outputs.csv

【讨论】:

Windows 上没有 CAT。 有些包比如Git自带cat,可能他把它误认为是DOS命令了。 微软肯定发布了 cat.exe -> 它包含在 nt4 资源工具包中 - 请参阅 news.microsoft.com/1996/10/29/…【参考方案4】:

将所有需要复制的文件放在一个单独的文件夹中,方便放在c盘中。

打开命令提示符 - windows>输入 cmd>选择命令提示符。

您可以看到默认目录指向 - 例如:C:[Folder_Name]>。 使用“cd [Folder_Name]”命令将目录更改为指向您放置要复制的文件的文件夹。

指向目录后 - 键入“dir”,它显示文件夹中存在的所有文件,只是为了确保一切都在适当的位置。

现在输入:'copy *.txt [newfile_name].txt' 并按回车键。

完成!

单个文件中的所有文本都将复制到 [newfile_name].txt

【讨论】:

这似乎在结果文件的末尾附加了一个额外的 0x1A 字符,如果我从过去的糟糕日子回忆起来,它是“控制 Z”,文件结束标记. 不要忘记删除文件末尾多余的字符 0x1A【参考方案5】:

cat "输入文件" > "输出文件"

这适用于 PowerShell,它是当前 Windows 版本中的 Windows 首选 shell,因此它可以工作。它也是上述答案的唯一版本,可用于处理“类型”或“复制”失败的大文件。

【讨论】:

OP 编辑​​了他们的帖子:Its Windows XP。 Win XP 也有解决方案吗? 使用资源工具包 nt 4.0 - 有一个 cat.exe(仍在 win10 上工作)【参考方案6】:

Windows type 命令的工作方式与 UNIX cat 类似。

示例 1: 与文件名合并(这将合并 file1.csv 和 file2.csv 以创建 concat.csv)

type file1.csv file2.csv > concat.csv

示例 2: 合并带有模式的文件(这将合并所有带有 csv 扩展名的文件并创建 concat.csv)

使用星号(*) 连接所有文件时。请不要对目标文件使用相同的扩展名(例如.csv)。模式应该有所不同,否则目标文件也会在连接中考虑

type  *.csv > concat_csv.txt

【讨论】:

这是最直接的unix命令等价物,这应该是公认的答案 这也是最低效的方式,因为“type”将在 4 KiB 块中完成它的工作,这使得操作非常缓慢。 不要对目标文件使用相同的扩展名。当我运行这个命令时,我只等了几分钟,直到我注意到它陷入了无限循环,将目标文件添加到自身并创建了一个不断增长的文件(当我注意到它在尝试合并 2MB 时卡住时达到了 15GB文件)。 工作得很好,谢谢。注意:比 LINUX 慢得多...【参考方案7】:

你可以使用 type:

type"C:\<Directory containing files>\*.txt"> merged.txt

目录中的所有文件都将附加到文件merged.txt

【讨论】:

【参考方案8】:

我重申已经提出的其他一些观点,但包括第 3 个示例,当您在想要连接的文件夹中有文件时,它会有所帮助。

示例1(同一文件夹中的文件):

copy file1.txt+file2.txt+file3.txt file123.txt

示例 2(同一文件夹中的文件):

type *.txt > combined.txt

示例 3(文件存在于多个文件夹中,假设 newfileoutput.txt 不存在):

for /D %f in (folderName) DO type %f/filename.txt >> .\newfileoutput.txt

【讨论】:

【参考方案9】:

在 Win 7 中,导航到文本文件所在的目录。在命令提示符下使用:

copy *.txt combined.txt

其中combined.txt 是新创建的文本文件的名称。

【讨论】:

以上是关于Windows 批处理 - 将多个文本文件连接成一个的主要内容,如果未能解决你的问题,请参考以下文章

WINDOWS 批处理命COPY 合并多个文件的问题

使用 case 语句将多行连接成一列

设计模式のChainOfResponsibilityPattern(责任链模式)----行为模式

通过 Windows 批处理文件将字符串替换为文本文件中的 unicode

循环批处理文件,用于将来自不同文件夹的多个文本文件合并到另一个不同文件夹中的一个文本文件

将多个 json 对象存储到文本文件 iOS