我有多个文本文件,大约有100,000行,我想将它们拆分成每个5000行的较小文本文件。
我曾经:
split -l 5000 filename.txt
这将创建文件:
xaa
xab
aac
xad
xbe
aaf
没有扩展名的文件。我只是想给他们打个类似的电话:
file01.txt
file02.txt
file03.txt
file04.txt
或者,如果这不可能,我只希望他们有“.txt”扩展名。
@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
SET /a fcount=100
SET /a llimit=5000
SET /a lcount=%llimit%
FOR /f "usebackqdelims=" %%a IN ("%sourcedir%\q25249516.txt") DO (
CALL :select
FOR /f "tokens=1*delims==" %%b IN ('set dfile') DO IF /i "%%b"=="dfile" >>"%%c" ECHO(%%a
)
GOTO :EOF
:select
SET /a lcount+=1
IF %lcount% lss %llimit% GOTO :EOF
SET /a lcount=0
SET /a fcount+=1
SET "dfile=%sourcedir%\file%fcount:~-2%.txt"
GOTO :EOF
这是一个本机windows批处理,可以完成此任务。
现在我不会说它会很快(每个5Kline输出文件不到2分钟)或者它会对批量字符敏感免疫。实际上取决于您的目标数据的特征。
我使用了一个名为q25249516.txt
的文件,其中包含了100行数据用于测试。
修订版或快速版
雷姆
@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
SET /a fcount=199
SET /a llimit=5000
SET /a lcount=%llimit%
FOR /f "usebackqdelims=" %%a IN ("%sourcedir%\q25249516.txt") DO (
CALL :select
>>"%sourcedir%\file$$.txt" ECHO(%%a
)
SET /a lcount=%llimit%
:select
SET /a lcount+=1
IF %lcount% lss %llimit% GOTO :EOF
SET /a lcount=0
SET /a fcount+=1
MOVE /y "%sourcedir%\file$$.txt" "%sourcedir%\file%fcount:~-2%.txt" >NUL 2>nul
GOTO :EOF
请注意,我使用了50000的llimited
进行测试。如果llimited
*100比文件中的行数更小,将覆盖早期的文件编号(通过将fcount
设置为1999
并在文件重命名行中使用~3
代替~2
来治愈。)
下面是C#中的一个示例(因为这正是我要搜索的)。我需要将一个23 GB的csv文件拆分为大约1.75亿行,才能查看这些文件。我把它分成了100万行的文件。这段代码在我的机器上用了大约5分钟:
var list = new List<string>();
var fileSuffix = 0;
using (var file = File.OpenRead(@"D:\Temp\file.csv"))
using (var reader = new StreamReader(file))
{
while (!reader.EndOfStream)
{
list.Add(reader.ReadLine());
if (list.Count >= 1000000)
{
File.WriteAllLines(@"D:\Temp\split" + (++fileSuffix) + ".csv", list);
list = new List<string>();
}
}
}
File.WriteAllLines(@"D:\Temp\split" + (++fileSuffix) + ".csv", list);
我知道这个问题很久以前就被问到了,但我很惊讶没有人给出最直截了当的Unix答案:
split -l 5000 -d --additional-suffix=.txt $FileName file
-l 5000
:将文件拆分为每个 5,000 行的文件。-d
: 数字后缀。这将使后缀默认从 00 变为 99,而不是 aa 到 zz。--附加后缀
:允许您指定后缀,此处为扩展名$FileName
:要拆分的html" target="_blank">文件的名称。文件
:要添加到结果文件的前缀。一如既往,请查看< code>man split了解更多详细信息。
对于Mac,split
的默认版本被简化。您可以使用以下命令安装GNU版本。(有关更多GNU实用工具,请参阅此问题。)
brew install coreutils
然后,您可以通过将< code>split替换为< code>gsplit来执行上述命令。有关详细信息,请查看< code>man gsplit。
问题内容: 我想将一个大小约为50GB的大型文本文件拆分为多个文件。文件中的数据就像这样-[x = 0-9之间的任何整数] 文件中可能只有几十亿行,我想为每个文件写例如30/40百万。我想这些步骤将是- 我要打开文件 然后使用readline()必须逐行读取文件并同时写入新文件 一旦达到最大行数,它将创建另一个文件并再次开始写入。 我想知道如何将所有这些步骤以一种高效且更快的内存方式组合在一起。我
问题内容: 我得到一个包含以下内容的文本文件(12 MB): 有什么办法来分流到12个* .txt文件让说,,(......)? 问题答案: 您可以使用linux bash核心实用程序 注意,或两者都OK,但大小不同。MB为1000 * 1000,M为1024 ^ 2 如果要按行分隔,可以使用参数。 更新 Kirill建议的另一种解决方案,您可以执行以下操作 请注意,是不是,有几个选项,比如,,,
问题内容: 如果我在每行上都有一个带有单独命令的文本文件,我将如何使终端将每行作为命令运行?我只是不想一次复制和粘贴1行。它不必是文本文件,而可以是任何可以使用的文件。 : 问题答案: 您可以使用这些命令创建一个shell脚本,然后创建,然后通过运行 编写bash脚本非常简单 样机sh文件:
问题内容: 我正在尝试将一个大型xml文件拆分为多个文件,并在AWK脚本中使用了以下代码。 上面的代码生成一个名称为“ fileItem_1”,“ fileItem_2”,“ fileItem3”等的xml文件列表。 但是,我希望文件名类似于“ item_XXXXX”,其中XXXXX是XML内的一个节点-如下图所示 因此,基本上我希望“ id”节点为文件名。谁能帮我这个忙吗? 问题答案: 我不会用
问题内容: 我有这样的输入文件: 所需的任务是按由特殊行分隔的部分读取文件,在这种情况下,该行为空行,例如[out]: 通过这样做,我一直在获得所需的输出: 但是,如果特殊行是以例如以下开头的行: 我必须这样做: 如果我允许拥有分隔符参数,则可以尝试以下操作: 但是有没有办法我不对所有可能的分隔符进行硬编码? 问题答案: 传递谓词怎么样? 用法:
问题内容: 假设我们有许多文本文件,如下所示: 文件1: 文件2: 文件3: 文件4: 我们如何制作一个文本文件,如下所示: 结果: 相关代码可能是: 在这之后?有什么帮助吗? 问题答案: 您可以将每个文件的内容直接读取到输出文件句柄的write方法中,如下所示: