基于 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文件的地址 * 返回: ...
随机推荐
- ANDROID 系统提示对话框(ALERTDIALOG)的使用
new AlertDialog.Builder(baseActivity).setTitle("删除确认")//设置对话框标题 .setMessage("您确定要删除选中 ...
- eclipse中去除build时总是js错误的问题
在用eclipse时经常莫名其名的弹出如下框框,有的时候甚至还死循环了.严重影响开发效率. 原因分析就是我们项目的一些js代码,eclipse验证时有错误的,其实是没有错误的.不知道eclipse是怎 ...
- vb上位机模拟电压监测系统
vb作为一种古老的语言,在工作中已经用不到了,但这门语言也是我在校期间研究比较多的一种,基本的通讯,数据库,界面等模块已经比较了解,马上要进单位实习了,研究的是电机的变频器,软件这块,希望在以后的工作 ...
- Linux Kernel 代码艺术——编译时断言
本系列文章主要写我在阅读Linux内核过程中,关注的比较难以理解但又设计巧妙的代码片段(不关注OS的各个模块的设计思想,此部分我准备写在“深入理解Linux Kernel” 系列文章中),一来通过内核 ...
- HTML总结
几个知识点: HTML 指的是超文本标记语言 (Hyper Text Markup Language) HTML框架结构: <!DOCTYPE html> <html> < ...
- Android开发资源汇总
搜索 虫部落快搜(已被墙) Google免FQ镜像汇总 Lantern stackoverflow 博客 Android基础&进阶 深入理解Android 老罗的Android之旅 Andro ...
- NOIP2013花匠
描述 花匠栋栋种了一排花,每株花都有自己的高度.花儿越长越大,也越来越挤.栋栋决定把这排中的一部分花移走,将剩下的留在原地,使得剩下的花能有空间长大,同时,栋栋希望剩下的花排列得比较别致. 具体而言, ...
- 第1章 重构,第一个案例(2):分解并重组statement函数
2. 分解并重组statement (1)提炼switch语句到独立函数(amountFor)和注意事项. ①先找出函数内的局部变量和参数:each和thisAmount,前者在switch语句内未被 ...
- [codevs 2800]送外卖
题目描述 Description 有一个送外卖的,他手上有n份订单,他要把n份东西,分别送达n个不同的客户的手上.n个不同的客户分别在1~n个编号的城市中.送外卖的从0号城市出发,然后n个城市都要走一 ...
- python基础之循环结构以及列表
python基础之编译器选择,循环结构,列表 本节内容 python IDE的选择 字符串的格式化输出 数据类型 循环结构 列表 简单购物车的编写 1.python IDE的选择 IDE的全称叫做集成 ...