我遇到了以下问题:我有一个文件,大小接近 500mb。它的文本全部在一行中。文本用虚拟行尾分隔,它称为 ROW_DEL,在文本中如下所示:
this is a line ROW_DEL and this is a line
现在我需要执行以下操作,我想将此文件拆分成几行,以便获得如下文件:
this is a line and this is a line
问题是,即使我用 Windows 文本编辑器打开它,它也会中断,因为文件太大。
是否可以像我提到的那样使用 C#、Java 或 Python 拆分此文件?最好的解决方案是什么,以免我的 CPU 过度消耗。
你可以使用 流式处理(streaming approach) 来高效地处理这样的大文件。流式处理通过逐块读取和处理文件,避免将整个文件加载到内存中,既节省内存又不会让 CPU 过载。以下是分别使用 Python、Java 和 C# 实现的解决方案。
Python 提供了简单高效的文件处理方式,可以逐块读取文件并替换 ROW_DEL:
ROW_DEL
input_file = "largefile.txt" output_file = "outputfile.txt" # 使用流式读取和写入 with open(input_file, 'r') as infile, open(output_file, 'w') as outfile: while chunk := infile.read(1024 * 1024): # 每次读取 1MB 数据 chunk = chunk.replace("ROW_DEL", "\n") # 将 ROW_DEL 替换为换行符 outfile.write(chunk)
read(1024 * 1024)
2048 * 1024
\n
os.linesep
Java 中可以使用 BufferedReader 和 BufferedWriter 实现同样的功能:
BufferedReader
BufferedWriter
import java.io.*; public class SplitLargeFile { public static void main(String[] args) { String inputFile = "largefile.txt"; String outputFile = "outputfile.txt"; try (BufferedReader reader = new BufferedReader(new FileReader(inputFile)); BufferedWriter writer = new BufferedWriter(new FileWriter(outputFile))) { char[] buffer = new char[1024 * 1024]; // 1MB 缓冲区 int bytesRead; while ((bytesRead = reader.read(buffer)) != -1) { String chunk = new String(buffer, 0, bytesRead); chunk = chunk.replace("ROW_DEL", System.lineSeparator()); // 替换换行符 writer.write(chunk); } } catch (IOException e) { e.printStackTrace(); } } }
buffer
C# 使用 StreamReader 和 StreamWriter 处理大文件,代码如下:
StreamReader
StreamWriter
using System; using System.IO; class SplitLargeFile { static void Main() { string inputFile = "largefile.txt"; string outputFile = "outputfile.txt"; using (StreamReader reader = new StreamReader(inputFile)) using (StreamWriter writer = new StreamWriter(outputFile)) { char[] buffer = new char[1024 * 1024]; // 1MB 缓冲区 int bytesRead; while ((bytesRead = reader.Read(buffer, 0, buffer.Length)) > 0) { string chunk = new string(buffer, 0, bytesRead); chunk = chunk.Replace("ROW_DEL", Environment.NewLine); // 替换换行符 writer.Write(chunk); } } } }
Read
如果只是一次性任务,推荐 Python,如果需要复杂的系统集成,选择 Java 或 C#。