基于 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文件的地址 * 返回: ...
随机推荐
- [已解决]从微软合作伙伴资源和MSDN下载系统和软件Microsoft download Manager无效
有个itellyou,更新了所有MSDN的软件包.如果自己有微软的注册账户,还是从微软官网下载比较好.而且对自己账户里的系统和itellyou里的做了对比.发现SHA1码不相同,估计官方分配的序列号也 ...
- TCP协议
TCP是一个面向连接的协议,在发送数据之前,必须在双方之间建立一条连接. TCP首部 TCP数据封装在IP数据报中 TCP包首部 下面简单说明部分字段的作用: 端口号:通讯双方由IP地址和端口号标识. ...
- shell parameter expansitions
type testtype -a test math calculate:echo $((1+2*3)) parameter expansition:bash-4 introduced feature ...
- 使用Windbg在XP下Heap追踪失败的原因
1.故事背景 最近同事的代码中碰到一个bug会导致奔溃的bug,从dump上看是由于某个对象的堆内存指针被释放了,但代码仍调用了该对象指针的虚函数,从而引起内存访问违法崩溃,由于该类被大量使 ...
- python爬虫学习(1) —— 从urllib说起
0. 前言 如果你从来没有接触过爬虫,刚开始的时候可能会有些许吃力 因为我不会从头到尾把所有知识点都说一遍,很多文章主要是记录我自己写的一些爬虫 所以建议先学习一下cuiqingcai大神的 Pyth ...
- frakti && RunPodSandbox 源码分析
listen = flag.String("listen", "/var/run/frakti.sock", "...") hyperEnd ...
- sicily 中缀表达式转后缀表达式
题目描述 将中缀表达式(infix expression)转换为后缀表达式(postfix expression).假设中缀表达式中的操作数均以单个英文字母表示,且其中只包含左括号'(',右括号‘)’ ...
- android第一行代码-6.自定义控件的实现
0.假设一个应用中标题栏控件都是共用的,如果每个activity都需要设置button,绑定方法,那代码就会很臃肿.那我们可以自定义控件,然后继承这个控件就行了. 自定义控件为TitleLayout, ...
- docker-compose启动的tomcat无法远程连接jmx
最近想学习下java GC优化,就用了一下VisualVM,在远程服务器启动了一个非docker的tomcat,很顺利的就连接了,但是用docker-compose启动的服务却 怎么也连不上,一定是d ...
- 使用PhpDocumentor生成文档
一,网站根目录执行 $ composer require --dev phpdocumentor/phpdocumentor 二,进入vendor/bin/目录执行 $phpdoc -d D:\ser ...