TXT文件,3.2g,如何把这个文件分割成若干个小文件? 分割不能切开某一个时间线的数据。 11:11,1,2,3,4,5,6,7,8,9,0 例如上面的数据,如何按行分割,要求一行时间线的数据不能切开(也就是换行分割)? 最好给个源码看看,我现在分割可以但是没根据换行分割,而且分割的时候会超时 |
|
你就用换行符分割啊!超时估计是你的文档太大,但是应该还在运行的.你可以看分割后的文档有没有增加
|
|
每行长度一样?
那就计算分割文件SIZE,直接二进制操作就快了 |
|
FileStream fsIn = new FileStream(fileIn, FileMode.Open, FileAccess.Read); FileStream fsOut = new FileStream(fileOut, FileMode.OpenOrCreate, FileAccess.Write); int bufferLen = 4096*1000; byte[] buffer = new byte[bufferLen]; int bytesRead; bytesRead = fsIn.Read(buffer, 0, bufferLen); fsOut.Write(buffer, 0, bytesRead); |
|
超时之后就不会分割了,程序都报错了,没继续运行 |
|
每行长度不是一样的,这只是测试的数据,真正的数据不是这样的 |
|
protected void Button1_Click(object sender, EventArgs e) { int iFileSize = 10000 * 1024; FileStream TempStream = null; BinaryWriter TempWriter=null; //根据选择来设定分割的小文件的大小 string filepath = @"Z:\ftpfoot\ksd_rtx\KSD_RTX_140131.txt"; //反之则在计算机创建目录 FileStream SplitFileStream = new FileStream(filepath, FileMode.Open); //以文件的全路对应的字符串和文件打开模式来初始化FileStream文件流实例 BinaryReader SplitFileReader = new BinaryReader(SplitFileStream); //以FileStream文件流来初始化BinaryReader文件阅读器 byte[] TempBytes; //每次分割读取的最大数据 int iFileCount = (int)(SplitFileStream.Length / iFileSize); //小文件总数 //progressBar1.Maximum = iFileCount; if (SplitFileStream.Length % iFileSize != 0) iFileCount++; string[] TempExtra = filepath.Split("".""); /* 循环将大文件分割成多个小文件 */ for (int i = 1; i <= iFileCount; i++) { string sTempFileName = @"Z:\ftpfoot\ksd_rtx" + i.ToString().PadLeft(4, ""0"") + "." + TempExtra[TempExtra.Length - 1]; //小文件名 //确定小文件的文件名称 TempStream = new FileStream(sTempFileName, FileMode.OpenOrCreate); //根据文件名称和文件打开模式来初始化FileStream文件流实例 TempWriter = new BinaryWriter(TempStream); //以FileStream实例来创建、初始化BinaryWriter书写器实例 TempBytes = SplitFileReader.ReadBytes(iFileSize); //从大文件中读取指定大小数据 TempWriter.Write(TempBytes); //把此数据写入小文件 TempWriter.Close(); //progressBar1.Value = 0; //String fileName = @"Z:\ftpfoot\ksd_rtx\KSD_RTX_140131.txt"; //FilePartition objFp = new FilePartition(fileName); //if (objFp.OnPartitionFile()) // Response.Write(String.Format("共切割成{0}个文件.", objFp.FileCount)); } if (SplitFileReader != null) SplitFileReader.Close(); if (TempWriter != null) TempWriter.Close(); if (TempStream != null) TempStream.Close(); } |
|
这个给力.net对于大文件 我一直无解
来学习下 |
|
我以前写过一个按行读取分割的,分割几百MB的文档没问题,你的几GB不知道行不行.
|
|
sr.ReadLine()
|
|
20分 |
string name = Path.GetFileNameWithoutExtension(openFileDialog.FileName); saveFileDialog.Filter = "文本文件(*.txt)|*.txt"; int line = 0,num=0; if (!Directory.Exists(dizhi.Text + "\" + name)) { Directory.CreateDirectory(dizhi.Text + "\" + name); } string hang; StreamReader sr = new StreamReader(mubiao.Text, System.Text.Encoding.GetEncoding("UTF-8")); while ((hang = sr.ReadLine()) != null) { line++; StreamWriter sw = new StreamWriter(dizhi.Text + "\" + name + "\A" + num + ".txt", true, System.Text.Encoding.GetEncoding("UTF-8")); sw.WriteLine(hang); sw.Close(); if (line == 2000) { line = 0; num++; } } |
看来执行时间短不了
3.2G 复制黏贴一下 就要多长时间啊 还要分割出来。 |
|
正常的分割要不了多久,但是根据换行分割就不知道了 |
|
效果是达到了,但是速度貌似有点慢啊 |
|
没有程序,说说我的思路:
使用BinaryReader : 首先:假设截取的文件大小为1M(1024*1024 字节),从头读取。 binaryReader.BaseStream.Position = 1024*1024-1; 读取 1024*1024-1 处的字节判断是不是 换行符,不是的话,读取1024*1024 处,知道为换行符为止(假设为止为B) 则,读取0-B binaryReader.ReadBytes(B-0+1)个字节并保存。 然后从B+1 处读取,知道结束。 |
|
/// <summary>
/// 分割大文件成独立小文件并保存小文件至指定目录 /// </summary> /// <param name=”splitunit”>分割单位(KB,MB)</param> /// <param name=”intFlag”>分割大小</param> /// <param name=”destCatalog”>保存路径</param> /// <param name=”sourcefileurl”>源文件路径</param> /// <returns>true表示分割成功,false表示分割失败</returns> public static bool SplitFile(string splitunit, int intFlag, string destCatalog, string sourcefileurl) { bool suc = false; try { int iFileSize = 0; switch (splitunit) { case “Byte”: iFileSize = intFlag; break; case “KB”: iFileSize = 1024 * intFlag; break; case “MB”: iFileSize = 1024 * 1024 * intFlag; break; default: iFileSize = 1024 * 1024 * 1024 * intFlag; break; } FileStream SplitFileStream = new FileStream(sourcefileurl, FileMode.Open); BinaryReader SplitFileReader = new BinaryReader(SplitFileStream); Byte[] TempBytes; int ifilecount = (int)(SplitFileStream.Length / iFileSize); if (SplitFileStream.Length % iFileSize != 0) { ifilecount++; } for (int i = 1; i <= ifilecount; i++) { string sTempFileName = destCatalog + “\” + i.ToString().PadLeft(4, “”0″”) + Path.GetExtension(destCatalog); FileStream TempStream = new FileStream(sTempFileName, FileMode.OpenOrCreate); BinaryWriter bw = new BinaryWriter(TempStream); TempBytes = SplitFileReader.ReadBytes(iFileSize); bw.Write(TempBytes); bw.Close(); TempStream.Close(); } SplitFileStream.Close(); SplitFileReader.Close(); suc = true; } catch { suc = false; } return suc; } |
|
因为是逐行读取,你尝试下上面的方法吧 |
|
这个方法跟我写的如出一辙,快是很快,但是分割后的文件最后一条数据可能是断掉的,没有根据换行分割 |
|
这个思路我感觉可以,但是根据字节怎么得到文本里的内容呢 |
|
这容易 先用FileStream读取文件长度 然后设定每个文件长度大小为多少 另外一种是直接 } |
|
就这个你用FileStream 的类
fs.Read(); fs.ReadByte(); 基本是不会占内存的方法读取 他是直接定位到文件某处读取几个字节, 不像其他的类ReadLine()这样是先加载整个文件然后再读取 所以造成你的程序无法加载大文件,用FileStream几个字节几个字节读是不会有问题 的所以我上面说的你读两个字节就可以了, |
|
我根据你第一个方法读取我的byte字节数组,读不到换行符,也读不到内容,只是一下字节数字
|
|
换行符转换成字节byte1 如果等于binaryReader.ReadByte()获得字节,说明就是换行符,就可读取一段数据了 |
|
或者将你获得的字节转化成字符串和换行符比较 |
|
10分 |
/// <summary> /// 分割文件 /// </summary> /// <param name="fileName">原文件路径</param> /// <param name="outputFileName">目标文件路径</param> /// <param name="childFileLong">子文件大小(M)</param> private void SplitText(string fileName,string outputFileName, long childFileLong) { FileStream fileStream = new FileStream(fileName, FileMode.Open); BinaryReader binaryReader = new BinaryReader(fileStream); long childFilecount = 1024 * 1024; long allCount = fileStream.Length; int outputFileNumber = 0; long startPositon = 0; binaryReader.BaseStream.Position =startPositon+ childFilecount - 1; while (binaryReader.BaseStream.Position <= allCount) { while (Encoding.Default.GetString(new byte[] { binaryReader.ReadByte() }) != "/n" && binaryReader.BaseStream.Position<allCount-1) { binaryReader.BaseStream.Position++; } FileStream fileStreamOut = new FileStream(outputFileName+outputFileNumber.ToString(), FileMode.CreateNew); using (BinaryWriter binaryWriter = new BinaryWriter(fileStreamOut)) { binaryWriter.Write(binaryReader.ReadBytes((int)(binaryReader.BaseStream.Position - startPositon + 1))); } startPositon = binaryReader.BaseStream.Position + 1; binaryReader.BaseStream.Position = startPositon + childFilecount - 1; outputFileNumber++; } binaryReader.Close(); } |
以上代码供你参考,没有测试。如果子文件也比较大,为了避免占用大量内存空间, |
|
直接用FileStream一边读取一边写入,遇到换行符的时候新建文件!
|
|
while (binaryReader.BaseStream.Position <= allCount) { while (Encoding.Default.GetString(new byte[] { binaryReader.ReadByte() }) != "/n" && binaryReader.BaseStream.Position<allCount-1) { binaryReader.BaseStream.Position++; } 这两个循环次数太多了,我得到的文件allCount 长度是13亿多,但是binaryReader.BaseStream.Position的position值只有100多万这样也很慢 |
|
才30分呀,要是200分就给你实现一个 |
|
正常分割什么意思?先分成几个适当的文件,在按行处理
|
|
using System;
using System.IO; using System.Text; namespace File_Read static void ReadData(string sourcePath,string targetDirectory) while (line != null) static void WriteData(string str, string path) |