基于 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文件的地址 * 返回: ...
随机推荐
- ajax缓存问题
默认情况下,请求总会被发出去,但浏览器有可能从它的缓存中调取数据.换句话说,在缓存过期之前,针对相同地址发起的多个Ajax请求,只有第一次会真正发送到服务端.要禁止使用缓存的结果,可以设置 cache ...
- Javascript 中的严格模式
原文:http://www.ruanyifeng.com/blog/2013/01/javascript_strict_mode.html 一.概述 除了正常运行模式,ECMAscript 5添加了第 ...
- 解决开启SQL Server sql Always on Group 事务日志增大的问题
配置了Alwayson之后,因为没有只能使用完全恢复模式,不能使用简单或大容量日志模式,所以日志不断增长,不能使用改变恢复模式的方式清空日志 手动操作收缩或截断日志也无效 读了一些文章后发现,有人使用 ...
- UVALive 4670 Dominating Patterns --AC自动机第一题
题意:多个模板串,一个文本串,求出那些模板串在文本串中出现次数最多. 解法:AC自动机入门模板题. 代码: #include <iostream> #include <cstdio& ...
- 洛谷P1372 又是毕业季I&&P1414 又是毕业季II[最大公约数]
P1372 又是毕业季I 题目背景 “叮铃铃铃”,随着高考最后一科结考铃声的敲响,三年青春时光顿时凝固于此刻.毕业的欣喜怎敌那离别的不舍,憧憬着未来仍毋忘逝去的歌.1000多个日夜的欢笑和泪水,全凝聚 ...
- IIS短文件名暴力枚举漏洞利用脚本
import sys import httplib import urlparse import threading import Queue import time class Scanner(): ...
- SmallPtAMP: C++ AMP implementation of SmallPt / SmallPtGPU
前段时间突然对SmallPtGPU很感兴趣,于是自己也照葫芦画瓢搞了一个C++AMP的版本,整体跟SmallPtGPU基本相同,但是去掉了SmallPtGPU中显式计算直接光照的步骤,因而实现更加接近 ...
- HTML页面和JSP页面禁止缓存
一.JSP页面禁止缓存: 防止浏览器缓存当前访问的JSP动态页面,可以采用如下的方式进行设置,此效果如下的“HTML禁止缓存”: % 将过期日期设置为一个过去时间response.setHeader( ...
- 2.0(3)MongoDB数据导入导出
——————(1)数据导出———————— 导出为JSON格式 mongoexport -d '数据库' -c '表名' -o ***.json 导出为csv mongoexport -d '数据库' ...
- sublimetext3安装px转rem的神器
在用sublimetext3写css的时候,我们有时会进行单位换算,为了更快的获得我们想要的单位结果,我们可以安装cssrem这个神器(插件). 首先,我们要先下载好插件,下载地址如下: 地址:htt ...