思路:

  文本文件不能随意穿插信息,但是通过使用Seek()方法,可以在读取文本文件中移动光标从而修改所要修改的行.

  思路步骤:

1、读取文件,打开csv文件,获取文件流,seek移动光标到开始, for循环寻找出字符“\r\n”,运用两个变量锁定要修改的行数

2、第二个变量锁定后,将后面不修改部分保存到缓存区

   2、移动到锁定的位置重写改行数据——实现修改该行的目标,然后重新写入缓存区的不变内容。

   下面提供覆盖式修改csv文件的示例代码:

 /// <summary>
/// 在csv文件某行中覆盖重写
/// </summary>
/// <param name="strFilePath">文件路径</param>
/// <param name="rowNumber">修改的行数(不包含0)</param>
/// <param name="str">覆盖的内容</param>
/// <returns></returns>
public static bool csv_rowWrite(string strFilePath, int rowNumber, string str)
{
try
{
if (!File.Exists(strFilePath))
{
MessageBox.Show("读取的文件不存在!!");
return false;
}
else if (rowNumber <= )
{
MessageBox.Show("该方法不能修改第" + rowNumber + "行");
return false;
}
using (FileStream fs = new FileStream(strFilePath, FileMode.Open))
{
fs.Seek(, SeekOrigin.Begin);
//查找2个换行符位置
//p1定位<修改行的前一个换行符>后一个字节,p2定位<修改行的后一个换行符>后一个字节,用于定位后面的内容缓存到一个缓冲区
long p1 = -, p2 = -;
var last = ;
//记录换行符个数
int rowNum = ;
for (int i = ; i < fs.Length; ++i)
{
if (rowNumber == )
{
p1 = ;
var c = fs.ReadByte();
if (last == '\r' && c == '\n')
{
p2 = fs.Position;
break;
}
last = c;
}
else
{
var c = fs.ReadByte();
if (last == '\r' && c == '\n')
{
rowNum++;
if (rowNum == rowNumber - || rowNum == rowNumber)
{
if (p1 == -)
{
p1 = fs.Position;
}
else
{
p2 = fs.Position;
break;
}
}
}
last = c;
}
}
//未找到行
if (p1 == -)
{
MessageBox.Show("路径文件" + strFilePath + "中,第" + rowNumber + "行不存在数据");
return false;
}
//第二个换行符之后的内容,如果是超大文件,分批缓存,避免内存占用过多
var sr = new StreamReader(fs);
//流的当前位置是p2,保存后半部分不修改的内容到缓存区end
var end = sr.ReadToEnd();
//重新写入第一个标记点之后的内容
fs.Seek(p1, SeekOrigin.Begin);
fs.SetLength(p1);
var sw = new StreamWriter(fs);
sw.WriteLine(str);
sw.Write(end);
sw.Flush();
return true;
} }
catch (Exception ex)
{
MessageBox.Show("异常:\n" + ex.Message);
return false;
}
}

灵活运用光标位置p1,p2可以实现追加内容的效果。

 

  

在csv表格中修改/追加某行数据的更多相关文章

  1. 取SQL分组中的某几行数据

    取SQL分组中的某几行数据 对表中数据分组,有时只需要某列的聚合值:有时却需要返回整行数据,常用的方法有:子查询.ROW_NUMBER.APPLY,总体感觉还是ROW_NUMBER比较直观.测试数据: ...

  2. 使用js方法将table表格中指定列指定行中相同内容的单元格进行合并操作。

    前言 使用js方法对html中的table表格进行单元格的行列合并操作. 网上执行此操作的实例方法有很多,但根据实际业务的区别,大多不适用. 所以在网上各位大神写的方法的基础上进行了部分修改以适合自己 ...

  3. extjs 点击复选框在表格中增加相关信息行

    功能效果:点击复选框在表格中自动增加相关信息行,复选框取消则表格中内容自动删除 初始效果大概是这样~~~~~ // 定义初始 存放表格数据 var gridItems = []; //省份复选框 va ...

  4. 统计mysql库中每张表的行数据

    修改数据库配置文件:vim /etc/my.cnf [client] user=username password=password 使用shell脚本统计表中的行数据:count.sh #!/bin ...

  5. [简单]poi word2007表格按模版样式填充行数据

    主要实现了按照模版行的样式填充数据,针对的是动态数据,静态数据可以直接替换变量实现,先说下缺点:1)暂未实现特殊样式填充(如列合并(跨行合并)),只能用于普通样式(如段落间距 缩进 字体 对齐)2)数 ...

  6. 05. 取SQL分组中的某几行数据

    对表中数据分组,有时只需要某列的聚合值:有时却需要返回整行数据,常用的方法有:子查询.ROW_NUMBER.APPLY,总体感觉还是ROW_NUMBER比较直观.测试数据: if OBJECT_ID( ...

  7. Javaweb项目中修改表单时数据回显方法

    1.前言 先来说下什么是数据回显,比如我要修改我的个人信息,点击修改按钮后进入修改界面,在这个界面中直接将原来的信息显示在表单中,而不是空表单,这就是数据回显 2.思路 当点击修改的时候,从数据库中查 ...

  8. hive中同列多行数据组合的方法以及array to string要点(行转列)

    1. 同列多行数据组合成一个字段cell的方法, top N 问题的hive方案 如下: hive 列转行 to json与to array list set等复杂结构,hive topN的提取的窗口 ...

  9. [JS&Jquery]实现页面表格中相同内容的行或列合并

    详细链接:https://shop499704308.taobao.com/?spm=a1z38n.10677092.card.11.594c1debsAGeak<script type=&qu ...

随机推荐

  1. POJ_1166_暴搜

    题目描述: 有3*3的9个时钟,每个始终有0,1,2,3四种可以循环的状态码,每组数据给我们9个时钟的一种状态码.另外还有9种操作,分别使指定位置的时钟状态码加一,求使得9个时钟状态码全部置于0的最少 ...

  2. Codeforces Round #470 (Div. 2) A Protect Sheep (基础)输入输出的警示、边界处理

    Bob is a farmer. He has a large pasture with many sheep. Recently, he has lost some of them due to w ...

  3. spring中获取bean的方式

    获取bean的方式 1.可以通过上下文的getBean方法 2.可以通过@Autowired注入 定义controller @RestController @RequestMapping(" ...

  4. 微信小程序如何添加新的icon图标

    第一步 先去阿里云下载图标http://www.iconfont.cn/ 根据需要把图片的代码下载下来,下载完成之后是一个 压缩包,解压压缩包里面有一个css的文件复制到项目中,更改后缀为wxss 第 ...

  5. java设计模式7——桥接模式

    java设计模式7--桥接模式 1.桥接模式介绍 桥接模式是将抽象部分与它的实现部分分离,使他们都可以独立的变化.它是一种对象结构型模式,又称为柄体模式或接口模式. 2.解决问题 2.1.将复杂的组合 ...

  6. O准备如何苟进复赛圈?华为软挑开挂指南(附赛题预测)

    事先声明,这不是华为软挑的软广,我也不是海军. 这篇文章纯粹是心血来潮,原因是去年上传到github的参赛代码,前几天又有两个人star和fork了. 记得star热潮还是去年4月复赛刚结束的那几天, ...

  7. python学习(8)实例:写一个简单商城购物车的代码

    要求: 1.写一段商城程购物车序的代码2.用列表把商城的商品清单存储下来,存到列表 shopping_mail3.购物车的列表为shopping_cart4.用户首先输入工资金额,判断输入为数字5.用 ...

  8. [redis读书笔记] 第二部分 sentinel

    1.sentinel的初始化,会制定master的IP和port,然后sentinel会创建向被监视主服务器的命令连接和订阅连接: -  命令连接是用来和主服务器之间进行命令通信的 - 订阅连接,用于 ...

  9. Python3(十二) Pythonic与Python杂记

    一.用字典映射代替switch case语句 if/else可以代替switch但是非常不合适. 用字典代替switch: day = 5 switcher = { 0:'Sunday', 1:'Mo ...

  10. javascript 动态加载javascript文件

    /* loadFile(data, callback): 动态加载js文件 data: 存放需要加载的js文件的url("url" || ["url", &qu ...