基于 BinaryReader 的高效切割TXT文件
日常工作中免不了要面对一些文件的操作..
但是如果是日志文件..动辄上G的..处理起来就不那么轻松随意了..
尤其文件还很多的时候..
这个时候就会用到大文件切割..
下边贴出的示例是实验了一个 10G 的TXT文件来做的..效果还可以..全部切割成50M的文件大概用了一分多钟..
下面是代码..具体的流程在注释里都有..自己看..
要实验嘛..先做一个大文件出来..不用找了..跑这两行代码弄一个..
StreamWriter writer=new StreamWriter (@"E:\FTPS\data.csv");
for (int i = ; i < int.MaxValue; i++)
{
writer.WriteLine(i.ToString()+"\t 'fsdjklfjsdl','sdfsdlfjlsdjf','f123双方的dffdsfsdf','f发斯蒂芬sdjklfjsdl','sd地方fsdlfjlsdjf','f1发斯蒂芬2312dffdsfsdf'");
}
writer.Dispose();
前边有行号..方便切割之后看看数据完整性.
然后是干货..
//源文件
string sourceFile = @"E:\FTPS\data.csv";
//拆分后文件输出目录
string splitFileDirf = @"E:\FTPS\";
//每个文件的基本大小
long splitFileSize = * * ;
//开始位置
long readStart = ;
//拆分的文件名称序号
int SplitFileNum = ;
try
{
FileStream stream = new FileStream(sourceFile, FileMode.Open);
long FileTotalLength = stream.Length;
//创建二进制读取
using (BinaryReader reader = new BinaryReader(stream,Encoding.UTF8))
{
//直接将开始读取的位置设定到基础大小的字节上
//下面要做的是往后找到这一行的结束
reader.BaseStream.Position = splitFileSize - ;
//判断当前位置不超过文件总大小
while (reader.BaseStream.Position <= FileTotalLength)
{
//往后挨个儿字符找换行
//这里要说明的是 reader.ReadByte() 方法执行时会自动将 reader.BaseStream.Position 的值向后+1
//网上有些例子执行了 ReadByte 另外还做 Position++ 明显是有字符隔掉的
while (reader.BaseStream.Position < FileTotalLength && reader.ReadByte() != ) { } //对输出的文件地址创建流
FileStream fileStreamOut = new FileStream(splitFileDirf + SplitFileNum + ".csv", FileMode.Create);
//创建二进制写入
using (BinaryWriter binaryWriter = new BinaryWriter(fileStreamOut, Encoding.UTF8))
{
//这里获得现在找到换行的那个字节上的位置到这次遍历开始的位置中间的字节数量
//+1 是为了把找到的那个换行符也带上
int readWrodCountNow = (int)(reader.BaseStream.Position - readStart + );
//把读取的起始位置重置到这次查询的开始位置
reader.BaseStream.Position = readStart;
//把这次读取的内容写入到新文件
binaryWriter.Write(reader.ReadBytes(readWrodCountNow));
} //将这次读取到的位置作为下次的起始位置
readStart = reader.BaseStream.Position;
//下次的验证开始位置 从这里开始验证换行
reader.BaseStream.Position = readStart + splitFileSize - ;
//输出文件名
SplitFileNum++;
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
} Console.WriteLine("Complete");
//Console.ReadKey();
好啦..代码都在这里了..
说明白啊..网上有的代码有问题..在注释里说过问题在哪里..
核心代码就是这样了.. 要优化的可以包装一下..
比如隔断符号自定义..文件大小自定义什么的..自己弄吧..
基于 BinaryReader 的高效切割TXT文件的更多相关文章
- [大牛翻译系列]Hadoop(18)MapReduce 文件处理:基于压缩的高效存储(一)
5.2 基于压缩的高效存储 (仅包括技术25,和技术26) 数据压缩可以减小数据的大小,节约空间,提高数据传输的效率.在处理文件中,压缩很重要.在处理Hadoop的文件时,更是如此.为了让Hadoop ...
- 【基于WPF+OneNote+Oracle的中文图片识别系统阶段总结】之篇三:批量处理后的txt文件入库处理
篇一:WPF常用知识以及本项目设计总结:http://www.cnblogs.com/baiboy/p/wpf.html 篇二:基于OneNote难点突破和批量识别:http://www.cnblog ...
- [大牛翻译系列]Hadoop(19)MapReduce 文件处理:基于压缩的高效存储(二)
5.2 基于压缩的高效存储(续) (仅包括技术27) 技术27 在MapReduce,Hive和Pig中使用可分块的LZOP 如果一个文本文件即使经过压缩后仍然比HDFS的块的大小要大,就需要考虑选择 ...
- react FileReader读取TXT文件并保存 split切割字符串 map()分别渲染切割后的数组内的所有字符串
//class my_fileReader( e ) { console.log(e.target.files[0]); const reader = new File ...
- Javascript写入txt和读取txt文件的方法
文章主要介绍了Javascript写入txt和读取txt文件的方法,需要的朋友可以参考下1. 写入 FileSystemObject可以将文件翻译成文件流. 第一步: 例: 复制代码 代码如下: Va ...
- 基于哈夫曼编码的文件压缩(c++版)
本博客由Rcchio原创 我了解到很多压缩文件的程序是基于哈夫曼编码来实现的,所以产生了自己用哈夫曼编码写一个压缩软件的想法,经过查阅资料和自己的思考,我用c++语言写出了该程序,并通过这篇文章来记录 ...
- 按行切割大文件(linux split 命令简版)
按行切割大文件(linux split 命令简版) #-*- coding:utf-8 -*- __author__ = 'KnowLifeDeath' ''' Linux上Split命令可以方便对大 ...
- Python基于Python实现批量上传文件或目录到不同的Linux服务器
基于Python实现批量上传文件或目录到不同的Linux服务器 by:授客 QQ:1033553122 实现功能 1 测试环境 1 使用方法 1 1. 编辑配置文件conf/rootpath_fo ...
- java读取txt文件的2中方法---并将内容(每一行以固定的字符分割切成2段)存到map中去
#java读取txt文件的第一种方法 /** * 方法:readTxt * 功能:读取txt文件并把txt文件的内容---每一行作为一个字符串加入到List中去 * 参数:txt文件的地址 * 返回: ...
随机推荐
- LLVM 笔记(四)—— three-phase 设计的收益
ilocker:关注 Android 安全(新手) QQ: 2597294287 采用 three-phase 的设计方式,便于编译器支持多种语言和多种目标平台. 如果在优化器阶段采用通用的 IR ( ...
- javamail中的 javax.mail.AuthenticationFailedException: failed to connect
java.lang.RuntimeException: javax.mail.AuthenticationFailedException: failed to connect javax.mail.A ...
- MongoDB官方C#驱动中查询条件Query用法
Query.All("name", "a", "b");//通过多个元素来匹配数组 Query.And(Query.EQ("nam ...
- MMORPG大型游戏设计与开发(服务器 AI 基础接口)
一个模块都往往需要统一的接口支持,特别是对于非常大型的模块,基础结构的统一性非常重要,它往往决定了其扩展对象的通用性.昨天说了AI的基本概述以及组成,作为与场景模块中核心一样重要的地位,基础部分的设计 ...
- NopCommerce 增加 Customer Attributes
预期: Customer 新增一个自定义属性 运行站点 1.Admin -> Settings -> Customer settings -> Customer form field ...
- 洛谷P1372 又是毕业季I&&P1414 又是毕业季II[最大公约数]
P1372 又是毕业季I 题目背景 “叮铃铃铃”,随着高考最后一科结考铃声的敲响,三年青春时光顿时凝固于此刻.毕业的欣喜怎敌那离别的不舍,憧憬着未来仍毋忘逝去的歌.1000多个日夜的欢笑和泪水,全凝聚 ...
- 项目<<魔兽登录系统>>
创建魔兽系统相关窗体: 登录窗体(frmLogin) 注册窗体(frmRegister) 主窗体 (frmMain) 实现魔兽登录系统: 登录的界面如下 实现思路: 1.创建一个对象数组,长度为1 ...
- IO(四)----对象的序列化
对象的序列化: 将内存中的对象直接写入到文件设备中. 对象的反序列化: 将文件设备中持久化的数据转换为内存对象. 自定义类只要实现了Serializable接口,便可以通过对象输入输出流对对象进行 ...
- C++学习笔记(1)
本学习笔记是C++ primer plus(第六版)学习笔记.复习C++基础知识的可以瞄瞄. 转载请注明出处http://www.cnblogs.com/zrtqsk/p/3874148.html,谢 ...
- React基础知识
学习文档(按优先级排列)http://reactjs.cn/react/docs/tutorial-zh-CN.htmlhttp://www.cnblogs.com/Mrs-cc/p/4969755. ...