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. es6 新增 set 和 map数据结构以及应用场景

    https://www.cnblogs.com/sexintercourse/p/12269580.html Set数据容器,这是一个能够存储无重复值的有序列表. 1. 创建集合 set let se ...

  2. 高阶函数_函数柯里化 以及 setState中动态key

     使用柯里化: 1 state = { 2 username: "", 3 password: "", 4 }; 5 render() { 6 return ( ...

  3. 计算机网络之MAC和IP地址

    MAC地址 在局域网中,硬件地址,又称为物理地址或MAC地址. 目前现在的局域网中实际上使用的都是6字节的MAC地址,所以每一个以太网设备都具有唯一的MAC地址. MAC地址的格式 假设传输使用的是I ...

  4. cryptohack wp day(1)

    就从头开始吧 第一题 (ASCII) 一道简单的ASCII码转换,直接用题目的提示代码解就行了 ascii=[99, 114, 121, 112, 116, 111, 123, 65, 83, 67, ...

  5. 2022-07-27:小红拿到了一个长度为N的数组arr,她准备只进行一次修改, 可以将数组中任意一个数arr[i],修改为不大于P的正数(修改后的数必须和原数不同), 并使得所有数之和为X的倍数。

    2022-07-27:小红拿到了一个长度为N的数组arr,她准备只进行一次修改, 可以将数组中任意一个数arr[i],修改为不大于P的正数(修改后的数必须和原数不同), 并使得所有数之和为X的倍数. ...

  6. DataGridView数据内容自适应列宽

    数据自适应宽度某一列dataGridView1.Columns[@"列名"].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCe ...

  7. Javascript 常见的循环方式总结

    本文地址: https://www.cnblogs.com/zichliang/p/17412968.html 在Javascript中有很多种循环方式.有多种循环方式可以用来遍历数组.对象.以及执行 ...

  8. 500行代码手写docker-以新命名空间运行程序

    (2)500行代码手写docker-以新命名空间运行程序 本系列教程主要是为了弄清楚容器化的原理,纸上得来终觉浅,绝知此事要躬行,理论始终不及动手实践来的深刻,所以这个系列会用go语言实现一个类似do ...

  9. html+css简单易懂的轮播图实现

    实现轮播图感觉好复杂啊,这个比较简单的实现了 但是还是没有怎么理解代码,只能先发出来慢慢学习学习了 话不多说,直接上代码 <!DOCTYPE html> <html lang=&qu ...

  10. Adobe 构建 IDP 之路的经验与教训

    在过去的25年多时间里,我创建了软件组件和分布式框架,建立并领导了相关团队.近几年我致力于推动 Adobe 服务开发.部署和管理系统的开发人员生产力. 抽象陷阱 在云时代早期,Adobe 的每个团队都 ...