在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 ...
随机推荐
- HDU_3652_数位dp
http://acm.hdu.edu.cn/showproblem.php?pid=3652 cal(a,b,c,d),a表示当前位置,b表示是否有13的3种状态,c表示前面的数%13后的剩余,d表示 ...
- 一台电脑上配置多个git的ssh key
前几天公司的代码库全部迁移到了阿里云上,在配置git的ssh key的时候遇到了一个问题,那就是自己的密钥在添加时提示已经存在,原来是自己的个人账号上已经添加过这个密钥了,公司分配的账号就不能再添加这 ...
- EF core (code first) 通过自动迁移实现多租户数据分离 :按Schema分离数据
前言 本文是多租户系列文章的附加操作文章,如果想查看系列中的其他文章请查看下列文章 主线文章 Asp.net core下利用EF core实现从数据实现多租户(1) Asp.net core下利用EF ...
- NPOI word文档表格在新的文档中多次使用
最近有一个项目,涉及到文档操作,有一个固定的模版,模版中有文字和表格,表格会在新的文档中使用n多次 //获取模版中的表格FileStream stream = new FileStream(strPa ...
- pytorch --- word2vec 实现 --《Efficient Estimation of Word Representations in Vector Space》
论文来自Mikolov等人的<Efficient Estimation of Word Representations in Vector Space> 论文地址: 66666 论文介绍了 ...
- ELF和BIN的区别,资料整理
https://www.cnblogs.com/fah936861121/articles/8143556.html 1.Bin Bin文件是最纯粹的二进制机器代码, 或者说是"顺序格式&q ...
- 面试官:你说你熟悉jvm?那你讲一下并发的可达性分析
这是why技术的第35篇原创文章 上面这张图是我还是北漂的时候,在鼓楼附近的胡同里面拍的. 那天刚刚下完雨,路过这个地方的时候,一瞬间就被这五颜六色的门板和自行车给吸引了,于是拍下了这张图片.看到这张 ...
- 标准 I/O 和管道
1.标准输入和输出1>程序:指令+数据(指令服务于数据) 读入数据:input 输出数据:output 2>三种 I/O 设备 Linux 给程序提供三种 I/O 设备 标准输入(STDI ...
- package包
为什么需要package? 为了解决类之间的重名问题.为了方便管理类,合适的类放在合适的包. 怎么用package? 通常是类的第一句非注释性语句. 包名,域名倒着写,加上模块名,并与内部管理类. 命 ...
- JS杨辉三角形
题目:打印出杨辉三角形(要求打印出10行如下图) 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 分析: 1.第1列或列数=行数时,value=1 2.其余的值 ...