C# 处理 csv 文件中的双引号
C# CSV 双引号处理
直接上代码,自己写的,有问题可以随时联系
// 没有保证所有的都能对上,目前只处理了自己所遇见的格式
public static string[] SplitStr(string strdata)
{
if (!strdata.Contains("\"")) // 不包含 双引号 直接返回 split数组
return strdata.Split(',');
ArrayList cells = new ArrayList();
string str = "";
bool flag = false; // 双引号开始标记
for (int i = 0; i < strdata.Length; i++)
{
char ch = strdata[i];
if (ch == ',')
{
if (i + 1 < strdata.Length && strdata[i + 1] == ',') // 处理为空的情况
{
cells.Add(str);
str = "";
}
else if (!flag) // 如果没有双引号开始标记,就是一列的结束
{
cells.Add(str);
str = "";
}
else
str += ch;
}
else if (ch == '\"')
{
if (i + 1 < strdata.Length)
{
if (strdata[i + 1] == '"') // 字段内部的双引号
{
//
i++;
str += "\"";
}
else if (strdata[i + 1] == ',') // 后面是逗号要结尾了
{
flag = !flag;
}
else
{
flag = !flag;
}
}
}
else
{
str += ch;
}
}
cells.Add(str); // 最后一个数据
return (string[])cells.ToArray(typeof(string));
}
测试代码:
[TestMethod]
public void SplitTest()
{
const string data = "\"Bob said, \"\"Hey!\"\"\",2, 3 ";
var csv = Csv.SplitStr(data);
Assert.AreEqual(@"Bob said, ""Hey!""", csv[0]);
Assert.AreEqual("2", csv[1]);
Assert.AreEqual(" 3 ", csv[2]);
}
[TestMethod]
public void SplitTest2()
{
const string data = "\"\n\r\n\n\r\r\",,\t,\n";
var csv = Csv.SplitStr(data);
Assert.AreEqual("\n\r\n\n\r\r", csv[0]);
Assert.AreEqual("", csv[1]);
Assert.AreEqual("\t", csv[2]);
Assert.AreEqual("\n", csv[3]);
}
//2022-01-17 01:04:28,60562331,"rc international logistics pty, ltd",22.65,22.65,13249762,SCHEDULED1206945092,SCHEDULED,DR,2022-01-19 06:41:38,S,,,0,62184466,,60562331,7948840
[TestMethod]
public void SplitTest3()
{
const string data = "2022-01-17 01:04:28,60562331,\"rc international logistics pty, ltd\",22.65,22.65,13249762,SCHEDULED1206945092,SCHEDULED,DR,2022-01-19 06:41:38,S,,,0,62184466,,60562331,7948840";
var csv = Csv.SplitStr(data);
Assert.AreEqual("2022-01-17 01:04:28", csv[0]);
Assert.AreEqual("60562331", csv[1]);
Assert.AreEqual("rc international logistics pty, ltd", csv[2]);
Assert.AreEqual("22.65", csv[3]);
Assert.AreEqual("22.65", csv[4]);
Assert.AreEqual("13249762", csv[5]);
Assert.AreEqual("SCHEDULED1206945092", csv[6]);
Assert.AreEqual("SCHEDULED", csv[7]);
Assert.AreEqual("DR", csv[8]);
Assert.AreEqual("2022-01-19 06:41:38", csv[9]);
Assert.AreEqual("S", csv[10]);
Assert.AreEqual("", csv[11]);
Assert.AreEqual("", csv[12]);
Assert.AreEqual("0", csv[13]);
Assert.AreEqual("62184466", csv[14]);
Assert.AreEqual("", csv[15]);
Assert.AreEqual("60562331", csv[16]);
Assert.AreEqual("7948840", csv[17]);
}
测试结果截图:

其他参考
LumenWorks.Framework.IO 写的很不错的库,源码也是开放的,可以上去撸一撸
https://www.codeproject.com/Articles/9258/A-Fast-CSV-Reader
C# 处理 csv 文件中的双引号的更多相关文章
- 将CSV文件中的数据导入到SQL Server 数据库中
导入数据时,需要注意 CSV 文件中的数据是否包含逗号以及双引号,存在时,导入会失败 选择数据库 -> 右键 -> 任务 -> 导入数据 ,然后根据弹出的导入导出向导(如下图)中的提 ...
- MySQL添加CSV文件中的数据
一.MySQL添加csv数据 此问题是前几天整理数据的时候碰到的,数据存在 CSV文件中(200多万记录),通过python 往数据库中导入太慢了,后来使用MySQL 中自带的命令 LOAD DATA ...
- include 语句中使用双引号与括号有什么区别?
Include 的语法 你在学习如何构造函数时,看到了不同的 include 语句: # include <iostream> # include "distance.h&quo ...
- 直接把数据库中的数据保存在CSV文件中
今天突然去聊就来写一个小小的demo喽,嘿嘿 public partial class Form1 : Form { public Form1() { InitializeComponent(); } ...
- PowerDesigner导出的sql中去掉双引号,主要用于Oracle
如题,这些双引号对于Oracle建表实在是糟糕透了: 解决方法: (转载,作者的百度已经挂了,无法放上链接,自私一把,以前的Oracle项目不见了,无法展示) 1.去掉Oracle生成的SQL创建语句 ...
- DOS命令行中的双引号
在DOS命令窗口下,运行C:\Program Files\WinRAR\WinRAR.exe,提示如下错误: 因为C:\Program Files\WinRAR\WinRAR.exe中含有空格,它被分 ...
- C# 将List中的数据导入csv文件中
//http://www.cnblogs.com/mingmingruyuedlut/archive/2013/01/20/2849906.html C# 将List中的数据导入csv文件中 将数 ...
- 取出csv文件中的中文评论数据
# -*- coding: utf-8 -*- import csv import re csvfile = 'weibo.csv' def columns_data(path, column): c ...
- **后台怎么处理JSON数据中含有双引号?
http://bbs.csdn.net/topics/390578406?page=1 注意是后台,不是用js另外我这个json是直接取得别人的传过来的字符串,不是我自己拼写的,所以我自己不能做到转义 ...
- Jmeter实现从csv文件中随机读取数据
一.需求 参数放在csv文件中,文件格式如下,需求每次从文件中随机读取一行数据. 二.步骤 1.在csv文件中新增加一列,pl 2.新增一个配置原件-随机数,设置如下: 50是文件数据的行数 3.新增 ...
随机推荐
- 笔记:C++学习之旅---面向对象程序设计2
笔记:C++学习之旅---面向对象程序设计2 面向对象程序设计基于三个基本概念:数据抽象.继承和动态绑定. 继承和动态绑定对程序的编写有两方面的影响:一是我们可以更容易的定义与其他类相似但不完全相同的 ...
- vue2路由导航守卫(钩子函数)
https://router.vuejs.org/zh/guide/advanced/navigation-guards.html#%E5%85%A8%E5%B1%80%E5%89%8D%E7%BD% ...
- Django的message组件(源码分析)
Django的Message组件(源码分析) 1. 配置 # MESSAGE_STORAGE = 'django.contrib.messages.storage.fallback.FallbackS ...
- 如何实现一个sync.Once
sync.Once 是 golang里用来实现单例的同步原语.Once 常常用来初始化单例资源, 或者并发访问只需初始化一次的共享资源,或者在测试的时候初始化一次测试资源. 单例,就是某个资源或者对象 ...
- Prism Sample 2
例2引入了Region的概念. 例1中我们提到bootstrapper与app.xaml.cs,现在是这样的: public partial class App : PrismApplication ...
- UML类图——类之间的关系
关联关系(实线箭头) 是一种结构化关系,表示一类对象与另一类对象之间有联系.Java,c++,c#等编程语言在实现关联关系时,通常将一个类的对象作为另一个类的属性 - 双向关联 - 单向关联 - 自关 ...
- selenium 多窗口处理与网页frame
多窗口处理 点击某些链接,会重新打开一个窗口,对于这种情况.想在薪页面操作,就得先切换窗口了. 获取窗口得唯一标识用句柄表示,所以只需要切换句柄,就可以在多个页面进行操作了 1. 先获取到当前得窗口句 ...
- Spring AOP 分享
初级篇 AOP是什么? Aspect-oriented Programming (AOP) 即面向切面编程.简单来说,AOP 是一种编程范式,允许我们模块化地定义横跨多个对象的行为.AOP 可以帮助我 ...
- 2020-09-14:KVM和XEN虚拟化的区别?
福哥答案2020-09-14:#福大大架构师每日一题#[答案来自此链接](https://bbs.csdn.net/topics/397671000)KVM:1.虚拟化支持:全虚拟化.2.支持架构:虚 ...
- 2022-04-29:厨房里总共有 n 个橘子,你决定每一天选择如下方式之一吃这些橘子: 吃掉一个橘子。 如果剩余橘子数 n 能被 2 整除,那么你可以吃掉 n/2 个橘子。 如果剩余橘子数 n 能被
2022-04-29:厨房里总共有 n 个橘子,你决定每一天选择如下方式之一吃这些橘子: 吃掉一个橘子. 如果剩余橘子数 n 能被 2 整除,那么你可以吃掉 n/2 个橘子. 如果剩余橘子数 n 能被 ...