C# 读CSV文件

近期都在处理淘宝商品数据包识别问题,满以为CSV文件就是以行为分割,以逗号为字段分割的文件体系。

自己在编写处理程序时,增加了2个参数: 第一个,字符集,第二,告知处理方法,文件的列在第几行。

同时,对某些生成出来的数据包不规据的,例如生成出2个同名列的,等等文件,做了一定的容错。

满以为这样就OK了,没想到,老革命遇上新问题。原来 CSV文件中还是有转义的,引号即是。这一个处理,导致

程序出现了严重BUG,有一批数据包无法识别。。。。

现程序已经优化过。本CSV阅读程序,直接将CSV文件转换成TABLE格式,可以识别引号,可以识别在字符串中的回车,比一般网上查找的CSV文件

阅读程序要好,我试过,基本和WPS(我机器上没装OFFICE)容错能力一致。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
namespace test
{
public class JHCSV
{
public static DataTable LoadCsv(string filename, System.Text.Encoding encoder, char pfix, int headerLineIndex)
{
List<string> dataList = getData(filename, encoder);

DataTable dt = Getdt(dataList, headerLineIndex, pfix);

for (int i = headerLineIndex + 1; i < dataList.Count; i++)
{
if (dataList[i].Trim().Equals(""))
{
continue;
}
else
{
DataRow dr = dt.NewRow();
ReadLine(ref dr, dataList[i], pfix);
dt.Rows.Add(dr);
}
}

return dt;
}

private static DataRow ReadLine(ref DataRow dr, string line, char pfix)
{
string[] data = line.Split(new char[] { pfix });
StringBuilder ValueBuffer = new StringBuilder("");
int columnIndex = 0;
foreach (string str in data)
{
ValueBuffer.Append(str);
if (checkyh(ValueBuffer.ToString(), ‘"‘))
{
ValueBuffer = ValueBuffer.Replace("\"\"", "\"");
if (columnIndex < dr.Table.Columns.Count)
{
dr[columnIndex] = ValueBuffer.ToString().TrimStart(‘"‘).TrimEnd(‘"‘);
columnIndex++;
ValueBuffer.Clear();
}
else
{
Console.WriteLine(ValueBuffer.ToString());
ValueBuffer.Clear();
continue;
}
}
else
{
ValueBuffer.Append(pfix);
}
}
return dr;

}

private static DataTable Getdt(List<string> data, int headIndex, char pfix)
{
DataTable dt = new DataTable();
string[] columns = data[headIndex].Split(new char[] { pfix });
foreach (string columnname in columns)
{
if (columnname.Equals(""))
{
continue;
}
else
{
if (dt.Columns[columnname] != null)
{
dt.Columns.Add(columnname + "1");
}
else
{
dt.Columns.Add(columnname);
}

}
}

return dt;
}

private static List<string> getData(string filename, System.Text.Encoding encoder)
{
System.IO.StreamReader sr = new System.IO.StreamReader(filename, encoder);
List<string> dataList = new List<string>();
string line = sr.ReadLine();
System.Text.StringBuilder lineBuffer = new StringBuilder("");
while (line != null)
{
lineBuffer.Append(line);
if (checkyh(lineBuffer.ToString(),‘\"‘))
{
dataList.Add(lineBuffer.ToString());
lineBuffer = new StringBuilder("");
}

line = sr.ReadLine();
}

sr.Close();

return dataList;
}

public static bool checkyh(string str,char cp)
{
int i = 0;
foreach (char c in str)
{
if(c==‘\"‘)
{
i++;
}
}

if (i % 2 == 0)
{
return true;
}
else
{
return false;
}
}
}
}

时间: 2024-10-09 10:04:54

C# 读CSV文件的相关文章

JavaCSV之读CSV文件

Java在进行数据处理,有时候难免有进行CSV文件的操作,这里采用了JavaCSV读CSV文件. 1.准备工作 (1)第三方包库下载地址:https://sourceforge.net/projects/javacsv (2)相关文档:http://javacsv.sourceforge.net/ 2.使用简单的读操作 (1)引入javacsv包 import com.csvreader.CsvReader; (2)创建文件路径 String file = "src/com/test/csv/t

C++读CSV文件,处理数据

//读写 #include "global.h"#include <iostream>#include <fstream>        //读取文件数据的函数fin的头文件#include <sstream>        //istringstream 必须包含这个头文件 using namespace std;        using std::ofstream;vector<AQIvalue> allSites;vector&l

python读csv文件中文汉字出现UnicodeDecodeError

出错代码:data = pd.read_csv(fname); 原因:byte 0xcb不能被解码成utf-8编码: 解决方法:指定使用gbk编码 data = pd.read_csv(fname, encoding='gbk'); 原文地址:https://www.cnblogs.com/HITSZ/p/8688616.html

CSV文件读取,解决汉字乱码

public String getDeptOuId(String openId) throws IOException { String deptId = ""; // 存储信息的文件的绝对路径  String csvPath = FileUtil.getWorkingPath()  .resolve(ConfigUtil.getConfig().get("idmappings")).toString(); System.out.print(csvPath); //

springbatch操作CSV文件

一.需求分析 使用Spring Batch对CSV文件进行读写操作: 读取一个含有四个字段的CSV文件(id, name, age, score), 对文件做简单的处理, 然后输出到另一个csv文件中. 二.代码实现 1. 代码结构图: JobLaunch: 启动Job CsvItemProcessor: 对Reader数据进行处理 Student: 实体对象 input.csv: 数据读取文件 output.csv: 数据输出文件 2. applicationContext.xml <?xml

Python-csv模块读写csv文件

import csv # 采用DictReader进行读写: # 读csv文件def get_data(self, from_file): test_data = [] with open(from_file, 'rb') as csv_file: csv.register_dialect('read', delimiter='\t', quoting=csv.QUOTE_NONE) reader = csv.DictReader(csv_file, dialect='read') for ro

用C#写的读写CSV文件

用C#写的读取CSV文件的源代码 CSV文件的格子中包含逗号,引号,换行等,都能轻松读取,而且可以把数据转化成DATATABLE格式 using System; using System.Text; using System.Collections; using System.IO; using System.Data; using System.Text.RegularExpressions; using System.Diagnostics; namespace CsvLib { #regi

PLSQL_PLSQL读写CSV文件方式(案例)

2012-01-06 Created By BaoXinjin 一.摘要 读写CSV的方式 1. 写CSV Step1. 创建测试目录 Step2. 写CSV文件 Step3. 查看CSV文件 2. 读CSV Step1. 创建测试表 Step2. 读CSV文件 Step3. 查看表 二.写CSV文件 Step1. 创建测试目录 --创建测试目录 CREATE OR REPLACE DIRECTORY bxjcsv AS '/home/oracle/bxjcsv'; --目录权限分配 GRANT

JavaCSV之写CSV文件

与JavaCSV读CSV文件相对应,JavaCSV也可以用来写数据到CSV文件中. 1.准备工作 (1)第三方包库下载地址:https://sourceforge.net/projects/javacsv (2)相关文档:http://javacsv.sourceforge.net/ 2.使用简单的读操作 (1)引入javacsv包相应的类 import com.csvreader.CsvWriter; (2)创建文件路径 String file = "src/com/xiaoming/csv/