基于 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文件的地址 * 返回: ...
随机推荐
- 005.nginx配置文件
1.替换nginx主配置文件 通过前面的配置,LNMP的环境已经搭建完成,现在我们替换nginx配置文件: [root@huh ~]# cd /usr/local/nginx/conf/[root@h ...
- libsvm简介和函数调用参数说明
1. libSVM简介 libSVM是台湾林智仁(Chih-Jen Lin) 教授2001年开发的一套支持向量机库,这套库运算速度挺快,可以很方便的对数据做分类或回归.由于libSVM程序小 ...
- Mongodb的安装
下载:http://www.mongodb.org/downloads mongodb-win32-x86_64-3.2.5-signed.msi 安装: 1.dos下切换至安装目录bin下: 2 ...
- iOS证书问题
链接: 关于IOS免证书真机安装的过程和问题 苹果IOS开发者账号的区别,企业账号,个人账号,公司团队账号,教育账号 苹果IOS开发者账号总结--发布应用APP时team name是否可以随意写? P ...
- NSBundle
属性: .使用类方法创建一个NSBundler对象 + (NSBundle *)mainBundle; eg:[NSBundle mailBundle]; .使用路径获取一个NSBundle 对象,这 ...
- Java多线程系列--“JUC线程池”06之 Callable和Future
概要 本章介绍线程池中的Callable和Future.Callable 和 Future 简介示例和源码分析(基于JDK1.7.0_40) 转载请注明出处:http://www.cnblogs.co ...
- asp.net(C#)网站发布后 Global.asax 里 Application_Error 不执行的问题
现象 在 Global.asax 用 Application_Error 捕捉了http的404,500等错误,在本机测试正常,发布后无效,几经周折终于解决了... 程序是这样设计的 Applicat ...
- Jquery DIV滚动至浏览器顶部位置固定
获取元素(这里定位元素A)距离顶部的高度,接着设定scroll滚动的事件,比如超过那个高度,把A的位置设定为fixed,小于该高度,修改回relative. 方法一: $(function() { v ...
- Prototype原型(创建型模式)
依赖关系的倒置:抽象不应该依赖于实现的细节,实现细节应该依赖于抽象. 原型模式的定义 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.prototype模式允许一个对象再创建另外一个可 ...
- 用上CommonMark.NET,.NET平台终于有了好用的markdown引擎
缺少好用的markdown引擎之前一直是.NET平台上的一个痛点.因为这个痛点,我们被迫痛苦地使用了pandoc--不是pandoc做的不好,而是pandoc是由Haskell开发的,只能在Windo ...