在csv表格中修改/追加某行数据
思路:
文本文件不能随意穿插信息,但是通过使用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表格中修改/追加某行数据的更多相关文章
- 取SQL分组中的某几行数据
取SQL分组中的某几行数据 对表中数据分组,有时只需要某列的聚合值:有时却需要返回整行数据,常用的方法有:子查询.ROW_NUMBER.APPLY,总体感觉还是ROW_NUMBER比较直观.测试数据: ...
- 使用js方法将table表格中指定列指定行中相同内容的单元格进行合并操作。
前言 使用js方法对html中的table表格进行单元格的行列合并操作. 网上执行此操作的实例方法有很多,但根据实际业务的区别,大多不适用. 所以在网上各位大神写的方法的基础上进行了部分修改以适合自己 ...
- extjs 点击复选框在表格中增加相关信息行
功能效果:点击复选框在表格中自动增加相关信息行,复选框取消则表格中内容自动删除 初始效果大概是这样~~~~~ // 定义初始 存放表格数据 var gridItems = []; //省份复选框 va ...
- 统计mysql库中每张表的行数据
修改数据库配置文件:vim /etc/my.cnf [client] user=username password=password 使用shell脚本统计表中的行数据:count.sh #!/bin ...
- [简单]poi word2007表格按模版样式填充行数据
主要实现了按照模版行的样式填充数据,针对的是动态数据,静态数据可以直接替换变量实现,先说下缺点:1)暂未实现特殊样式填充(如列合并(跨行合并)),只能用于普通样式(如段落间距 缩进 字体 对齐)2)数 ...
- 05. 取SQL分组中的某几行数据
对表中数据分组,有时只需要某列的聚合值:有时却需要返回整行数据,常用的方法有:子查询.ROW_NUMBER.APPLY,总体感觉还是ROW_NUMBER比较直观.测试数据: if OBJECT_ID( ...
- Javaweb项目中修改表单时数据回显方法
1.前言 先来说下什么是数据回显,比如我要修改我的个人信息,点击修改按钮后进入修改界面,在这个界面中直接将原来的信息显示在表单中,而不是空表单,这就是数据回显 2.思路 当点击修改的时候,从数据库中查 ...
- hive中同列多行数据组合的方法以及array to string要点(行转列)
1. 同列多行数据组合成一个字段cell的方法, top N 问题的hive方案 如下: hive 列转行 to json与to array list set等复杂结构,hive topN的提取的窗口 ...
- [JS&Jquery]实现页面表格中相同内容的行或列合并
详细链接:https://shop499704308.taobao.com/?spm=a1z38n.10677092.card.11.594c1debsAGeak<script type=&qu ...
随机推荐
- Airtest自动化测试工具介绍
官方网站:http://airtest.netease.com/ Airtest IDE: 跨平台的UI自动化测试编辑器,适用于游戏和App,详细参见官网文档:http://airtest.netea ...
- Codeforces 1064D Labyrinth(双端队列BFS)
题意: 给一个图,"*"不可以走,给你一个起点,限制向左走L次,向右走R次,上下不限制,问你最多可以走到多少个格子 思路: BFS,每次将上下走的策略加入队首,左右加入队尾,(相当 ...
- symfony传参,接收参数,twig方法记录
呜呜呜,很烦,让我自己完成一个在线学习系统后端,和前端整合一下,我把接口参数搞了半天(学习symfony太久远),记录一下屈辱历史,以后注意,不然上线了一堆bug,很烦 下面是几种返回的数据的格式 1 ...
- Xamarin.Forms 二维码扫描实践
开发环境: Visual Studio 2019 版本 16.4.5 公用平台nuget ZXing.Net.Mobile.Forms 2.4.1 Plugin.Permissions 5.0.0-b ...
- 免费网盘!无限申请5TB容量并且不限速的网盘!
鸽了好久没有更新博客了哎…… 前言 这里我先说一下下,本人深受百度网盘坑害,自己上传的文件,16GB下载花了3天时间 最后下载失败? 所以找到的一个新的储存个人文件的方法. 这个网盘是onedrive ...
- 吴恩达deepLearning.ai循环神经网络RNN学习笔记_看图就懂了!!!(理论篇)
前言 目录: RNN提出的背景 - 一个问题 - 为什么不用标准神经网络 - RNN模型怎么解决这个问题 - RNN模型适用的数据特征 - RNN几种类型 RNN模型结构 - RNN block - ...
- js模拟post提交表单
function post(URL, PARAMS) { var temp = document.createElement("form"); ...
- 用PHP&JS实现的ID&密码校验程序
声明:本程序纯粹是本人在学习过程中突发奇想做的,并未考虑任何可行性,实用性,只是留下来供以后参考. 前端页面 sign.html <!DOCTYPE html> <html> ...
- RT-Thread can - STM32F103ZET6
SDK版本v4.0.2 目前,RT-Thread Studio还不能够自定义添加can设备.下面介绍手动添加过程: 使用RT-Thread Studio创建一个简单工程 使用RT-Thread env ...
- Session注销后,浏览器后退仍显示Session信息
初学JavaWeb,在一次测试登录功能的时候,发现了登进去后,点击退出按钮注销session,浏览器按后退能够显示session信息,并且点击登录还能够不输入密码登录(前端页面没写JS限制输入后登录) ...