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 文件中的双引号的更多相关文章

  1. 将CSV文件中的数据导入到SQL Server 数据库中

    导入数据时,需要注意 CSV 文件中的数据是否包含逗号以及双引号,存在时,导入会失败 选择数据库 -> 右键 -> 任务 -> 导入数据 ,然后根据弹出的导入导出向导(如下图)中的提 ...

  2. MySQL添加CSV文件中的数据

    一.MySQL添加csv数据 此问题是前几天整理数据的时候碰到的,数据存在 CSV文件中(200多万记录),通过python 往数据库中导入太慢了,后来使用MySQL 中自带的命令 LOAD DATA ...

  3. include 语句中使用双引号与括号有什么区别?

    Include 的语法 你在学习如何构造函数时,看到了不同的 include 语句: # include <iostream> # include "distance.h&quo ...

  4. 直接把数据库中的数据保存在CSV文件中

    今天突然去聊就来写一个小小的demo喽,嘿嘿 public partial class Form1 : Form { public Form1() { InitializeComponent(); } ...

  5. PowerDesigner导出的sql中去掉双引号,主要用于Oracle

    如题,这些双引号对于Oracle建表实在是糟糕透了: 解决方法: (转载,作者的百度已经挂了,无法放上链接,自私一把,以前的Oracle项目不见了,无法展示) 1.去掉Oracle生成的SQL创建语句 ...

  6. DOS命令行中的双引号

    在DOS命令窗口下,运行C:\Program Files\WinRAR\WinRAR.exe,提示如下错误: 因为C:\Program Files\WinRAR\WinRAR.exe中含有空格,它被分 ...

  7. C# 将List中的数据导入csv文件中

    //http://www.cnblogs.com/mingmingruyuedlut/archive/2013/01/20/2849906.html C# 将List中的数据导入csv文件中   将数 ...

  8. 取出csv文件中的中文评论数据

    # -*- coding: utf-8 -*- import csv import re csvfile = 'weibo.csv' def columns_data(path, column): c ...

  9. **后台怎么处理JSON数据中含有双引号?

    http://bbs.csdn.net/topics/390578406?page=1 注意是后台,不是用js另外我这个json是直接取得别人的传过来的字符串,不是我自己拼写的,所以我自己不能做到转义 ...

  10. Jmeter实现从csv文件中随机读取数据

    一.需求 参数放在csv文件中,文件格式如下,需求每次从文件中随机读取一行数据. 二.步骤 1.在csv文件中新增加一列,pl 2.新增一个配置原件-随机数,设置如下: 50是文件数据的行数 3.新增 ...

随机推荐

  1. 视频会议中的AEC、AGC、ANS是什么?

    视频会议中的AEC.AGC.ANS是什么? 1.AGC是自动增益补偿功能(Automatic Gain Control),AGC可以自动调麦克风的收音量,使与会者收到一定的音量水平,不会因发言者与麦克 ...

  2. Jupyter Notebook(或vscode插件) 一个cell有多个输出

    方法一 在文件的开头加上如下代码,该方法仅对当前文件有效 from IPython.core.interativeshell import InteractiveShell InteractiveSh ...

  3. 2023-04-29:一个序列的 宽度 定义为该序列中最大元素和最小元素的差值。 给你一个整数数组 nums ,返回 nums 的所有非空 子序列 的 宽度之和 由于答案可能非常大,请返回对 109

    2023-04-29:一个序列的 宽度 定义为该序列中最大元素和最小元素的差值. 给你一个整数数组 nums ,返回 nums 的所有非空 子序列 的 宽度之和 由于答案可能非常大,请返回对 109 ...

  4. 2023-03-11:给定一个N*M的二维矩阵,只由字符‘O‘、‘X‘、‘S‘、‘E‘组成, ‘O‘表示这个地方是可通行的平地, ‘X‘表示这个地方是不可通行的障碍, ‘S‘表示这个地方有一个士兵,全

    2023-03-11:给定一个N*M的二维矩阵,只由字符'O'.'X'.'S'.'E'组成, 'O'表示这个地方是可通行的平地, 'X'表示这个地方是不可通行的障碍, 'S'表示这个地方有一个士兵,全 ...

  5. 2022-09-21:有n个动物重量分别是a1、a2、a3.....an, 这群动物一起玩叠罗汉游戏, 规定从左往右选择动物,每只动物左边动物的总重量不能超过自己的重量 返回最多能选多少个动物,求一个

    2022-09-21:有n个动物重量分别是a1.a2.a3-an, 这群动物一起玩叠罗汉游戏, 规定从左往右选择动物,每只动物左边动物的总重量不能超过自己的重量 返回最多能选多少个动物,求一个高效的算 ...

  6. 2021-12-17:长城守卫军问题。 长城上有连成一排的n个烽火台,每个烽火台都有士兵驻守。 第i个烽火台驻守着ai个士兵,相邻峰火台的距离为1。另外,有m位将军, 每位将军可以驻守一个峰火台,每个

    2021-12-17:长城守卫军问题. 长城上有连成一排的n个烽火台,每个烽火台都有士兵驻守. 第i个烽火台驻守着ai个士兵,相邻峰火台的距离为1.另外,有m位将军, 每位将军可以驻守一个峰火台,每个 ...

  7. ModuleNotFoundError: No module named 'pyecharts'

    ModuleNotFoundError: No module named 'pyecharts' 解决: pip install pyecharts

  8. GaussDB(DWS)迁移实践丨row_number输出结果不一致

    摘要:迁移前后结果集row_number字段值前后不一致,前在DWS上运行不一致. 本文分享自华为云社区<GaussDB(DWS)迁移 - oracle兼容 --row_number输出结果不一 ...

  9. Kubernetes(k8s)一次性任务:Job

    目录 一.系统环境 二.前言 三.Kubernetes Job简介 四.创建一次性任务job 4.1 创建一个简单任务的job 4.2 创建需要执行多次的job任务 五.测试job失败重试次数 六.j ...

  10. 新版本,ggplot2 v3.3.0 新特性来袭

    ggplot2 迎来了新的版本,官方宣布了一些新的特性.下面一起看看吧. 1. 轴代码重写 这有利于解决轴标签重叠的情况. 2. 新的 scale bin,它可以像使用 color, fill 一样使 ...