在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 ...
随机推荐
- lua学习之基础概念篇
基础概念 程序块 (chunk) 定义 lua 中的每一个源代码文件或在交互模式(Cmd)中输入的一行代码都称之为程序块 一个程序块就是一连串语句或者命令 lua 中连续的语句不需要分隔符,但为了可读 ...
- C++中类成员变量在初始化列表中的初始化顺序
引子:我们知道,C++中类成员变量的初始化顺序与其在类中的声明顺序是有关的. 先看代码: class TestClass1 { public: TestClass1() { cout << ...
- win10系统安装VMware虚拟机软件以及linux系统
一.安装VMware 1.在VMware官网下载VMware Workstation Pro 15.5.1 下载地址:https://my.vmware.com/cn/web/vmware/detai ...
- OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv2/v3 read server hello A: unknown protocol
gitlab版本为社区版: gitlab-ce_11.5.4-ce.0_amd64.deb 目录:/var/cache/apt/archives 配置邮箱的主要参数: user['git_user_e ...
- centos7安装node.js
安装版本:node-v10.15.3 一.安装必要的编译软件包 # yum install gcc gcc-c++ -y 二.从源码下载Nodejs 进入官网选择自己需要的版本 https://nod ...
- 0226 rest接口设计
背景 为了更方便的书写和阐述问题,文章中按照第一人称的角度书写.作为一个以java为主要开发语言的工程师,我所描述的都是java相关的编码和设计. 工程师的静态输出就是代码和文 ...
- 前端html,css考点
1, 内联元素,块级元素相关知识点 参考链接:https://edu.aliyun.com/a/103378 (1)置换元素 概念:浏览器根据元素的标签和属性,来决定元素的具体显示内容.<img ...
- 「Flink」事件时间与水印
我们先来以滚动时间窗口为例,来看一下窗口的几个时间参数与Flink流处理系统时间特性的关系. 获取窗口开始时间Flink源代码 获取窗口的开始时间为以下代码: org.apache.flink.str ...
- CentOS、Ubuntu的安装
Linux使用最广泛的2个发行版:CentOS.Ubuntu. CentOS安全性高,常用作企业的服务器,Ubuntu常用作个人桌面. 常见的虚拟机有2个: VM VirtualBox,这个是Orac ...
- opencv —— inpaint 图像修补、去除指定区域物体
实现图像修补.物体去除:inpaint 函数 void inpaint(InputArray src, InputArray inpaintMask, OutputArray dst, double ...