批处理文件创建许多带有特殊字符的文件

批处理文件创建许多带有特殊字符的文件

基本信息:我有一个文件“DB_OUTPUT.TXT”,有 304 行,我需要将其转换为 304 个文件(每行一个)。每行包含许多特殊字符,可能长达数万个字符。由于这些原因,我很难使用 cmd.exe 批处理文件(它限制了输入量)和 echo 命令(它会尝试执行每个特殊字符,除非我必须将它们全部转义)。

我还有一个文件“DB_OUTPUT_FILENAMES.TXT”,其中包含“db_output.txt”中即将成为文件的每一行的不同文件名。因此,DB_OUTPUT.TXT 的第 1 行需要成为新文件的主体,其名称等于 DB_OUTPUT_FILENAMES.TXT 的第 1 行。

额外信息:您可能已经猜到了,DB_OUTPUT.TXT 是数据库的输出;它包含 304 条记录,每条记录有 6 或 7 列,宽度固定,最后一列是 SQL 查询。这些行(数据库记录)中的每一行都将用作创建新数据库对象的脚本,这就是需要保留特殊字符的原因。

问题:有没有办法以批处理方式执行此操作? 我对 Windows 解决方案或 Linux 解决方案都很满意。

答案1

split应该可以工作(刚刚在二进制文件比你描述的还要糟糕):

split -l 1 DB_OUTPUT.txt

这将创建一堆以“x”开头的文件。要批量重命名它们,请先使用

ls x* > oldnames

再次检查行数是否一致:

wc -l oldnames DB_OUTPUT_FILENAMES.TXT

如果你的文件名列表长度合适,这应该会给出两倍相同的行数。最后,

( paste oldnames DB_OUTPUT_FILENAMES.TXT ) | while read i; do mv $i; done

(请注意,这假设输出文件名不包含空格。)

答案2

以下是一个 shell 脚本:

#!/bin/sh

test "$#" -ne 3 && { echo arguments: datafile namefile dstdir ; exit 1 ; }

data="$1"
names="$2"
dstdir="$3"

test -e "$dstdir" || mkdir "$dstdir"

while read fn ; do
    read -r lin <&3
    echo -n "$lin" >"$dstdir/$fn"
done <"$names" 3<"$data"

您可以在类 Unix 环境(如 Linux、Mac OS X 或 Windows 下的 Cygwin)中运行该脚本。例如,将脚本存储到文件中splittofiles。执行chmod a+x splittofiles

运行它:splittofiles DB_OUTPUT.TXT DB_OUTPUT_FILENAMES.TXT output。结果文件将会被创建在目录中output

脚本需要进一步完善,增加更多错误检查条件。注释中提到的 Python 程序可能比这个脚本更快。

相关内容