Mic*_* M. 377
你可以这样做:
using System.IO;
static void Main(string[] args)
{
using(var reader = new StreamReader(@"C:\test.csv"))
{
List<string> listA = new List<string>();
List<string> listB = new List<string>();
while (!reader.EndOfStream)
{
var line = reader.ReadLine();
var values = line.Split(';');
listA.Add(values[0]);
listB.Add(values[1]);
}
}
}
Run Code Online (Sandbox Code Playgroud)
Hab*_*eeb 155
我最喜欢的csv解析器是一个内置到.net库中的解析器.这是Microsoft.VisualBasic命名空间内隐藏的宝藏.以下是示例代码:
using Microsoft.VisualBasic.FileIO;
var path = @"C:\Person.csv"; // Habeeb, "Dubai Media City, Dubai"
using (TextFieldParser csvParser = new TextFieldParser(path))
{
csvParser.CommentTokens = new string[] { "#" };
csvParser.SetDelimiters(new string[] { "," });
csvParser.HasFieldsEnclosedInQuotes = true;
// Skip the row with the column names
csvParser.ReadLine();
while (!csvParser.EndOfData)
{
// Read current line fields, pointer moves to the next line.
string[] fields = csvParser.ReadFields();
string Name = fields[0];
string Address = fields[1];
}
}
Run Code Online (Sandbox Code Playgroud)
请记住添加引用 Microsoft.VisualBasic
有关解析器的更多详细信息,请参见:http://codeskaters.blogspot.ae/2015/11/c-easiest-csv-parser-built-in-net.html
as-*_*cii 73
LINQ方式:
var lines = File.ReadAllLines("test.txt").Select(a => a.Split(';'));
var csv = from line in lines
select (from piece in line
select piece);
Run Code Online (Sandbox Code Playgroud)
^^错了 - 尼克编辑
原来的回答者似乎试图填充csv一个二维数组 - 一个包含数组的数组.第一个数组中的每个项都包含一个数组,表示该行号,嵌套数组中的每个项都包含该特定列的数据.
var csv = from line in lines
select (line.Split(',')).ToArray();
Run Code Online (Sandbox Code Playgroud)
Pau*_*aul 33
我通常使用codeproject中的这个解析器,因为它有一堆字符转义和它为我处理的类似.
dig*_*All 31
您无法立即创建数组,因为您需要从头开始知道行数(这需要读取csv文件两次)
您可以将值存储为两个List<T>,然后使用它们或使用转换为数组List<T>.ToArray()
很简单的例子:
var column1 = new List<string>();
var column2 = new List<string>();
using (var rd = new StreamReader("filename.csv"))
{
while (!rd.EndOfStream)
{
var splits = rd.ReadLine().Split(';');
column1.Add(splits[0]);
column2.Add(splits[1]);
}
}
// print column1
Console.WriteLine("Column 1:");
foreach (var element in column1)
Console.WriteLine(element);
// print column2
Console.WriteLine("Column 2:");
foreach (var element in column2)
Console.WriteLine(element);
Run Code Online (Sandbox Code Playgroud)
NB
请注意,这只是一个非常简单的例子.使用string.Split不考虑某些记录中包含分隔符的;情况.
为了更安全的方法,请考虑在nuget上使用一些csv特定库,如CsvHelper.
jos*_*shb 31
刚刚遇到这个库:https://github.com/JoshClose/CsvHelper
非常直观且易于使用.还有一个nuget包,可以快速实现:http://nuget.org/packages/CsvHelper/1.17.0 .也似乎积极维护我喜欢.
将其配置为使用分号很简单:https://github.com/JoshClose/CsvHelper/wiki/Custom-Configurations
tom*_*msv 30
这是我对最高投票答案的变化:
var contents = File.ReadAllText(filename).Split('\n');
var csv = from line in contents
select line.Split(',').ToArray();
Run Code Online (Sandbox Code Playgroud)
csv然后可以使用该变量,如以下示例所示:
int headerRows = 5;
foreach (var row in csv.Skip(headerRows)
.TakeWhile(r => r.Length > 1 && r.Last().Trim().Length > 0))
{
String zerothColumnValue = row[0]; // leftmost column
var firstColumnValue = row[1];
}
Run Code Online (Sandbox Code Playgroud)
Mat*_*att 11
如果需要跳过(头部)行和/或列,可以使用它来创建二维数组:
var lines = File.ReadAllLines(path).Select(a => a.Split(';'));
var csv = (from line in lines
select (from col in line
select col).Skip(1).ToArray() // skip the first column
).Skip(2).ToArray(); // skip 2 headlines
Run Code Online (Sandbox Code Playgroud)
如果您需要在进一步处理数据之前对数据进行整形(假设前两行由标题组成,第一列是行标题 - 您不需要在数组中,因为您只是想要看数据).
注意您可以使用以下代码轻松获取标题和第1列:
var coltitle = (from line in lines
select line.Skip(1).ToArray() // skip 1st column
).Skip(1).Take(1).FirstOrDefault().ToArray(); // take the 2nd row
var rowtitle = (from line in lines select line[0] // take 1st column
).Skip(2).ToArray(); // skip 2 headlines
Run Code Online (Sandbox Code Playgroud)
此代码示例假定您的*.csv文件的以下结构:

注意:如果您需要跳过空行 - 有时可以方便地使用,可以通过插入来实现
where line.Any(a=>!string.IsNullOrWhiteSpace(a))
Run Code Online (Sandbox Code Playgroud)
在上面的LINQ代码示例中from的select语句和语句之间.
您可以在C#中使用Microsoft.VisualBasic.FileIO.TextFieldParser dll以获得更好的性能
从上面的文章获得以下代码示例
static void Main()
{
string csv_file_path=@"C:\Users\Administrator\Desktop\test.csv";
DataTable csvData = GetDataTabletFromCSVFile(csv_file_path);
Console.WriteLine("Rows count:" + csvData.Rows.Count);
Console.ReadLine();
}
private static DataTable GetDataTabletFromCSVFile(string csv_file_path)
{
DataTable csvData = new DataTable();
try
{
using(TextFieldParser csvReader = new TextFieldParser(csv_file_path))
{
csvReader.SetDelimiters(new string[] { "," });
csvReader.HasFieldsEnclosedInQuotes = true;
string[] colFields = csvReader.ReadFields();
foreach (string column in colFields)
{
DataColumn datecolumn = new DataColumn(column);
datecolumn.AllowDBNull = true;
csvData.Columns.Add(datecolumn);
}
while (!csvReader.EndOfData)
{
string[] fieldData = csvReader.ReadFields();
//Making empty value as null
for (int i = 0; i < fieldData.Length; i++)
{
if (fieldData[i] == "")
{
fieldData[i] = null;
}
}
csvData.Rows.Add(fieldData);
}
}
}
catch (Exception ex)
{
}
return csvData;
}
Run Code Online (Sandbox Code Playgroud)
var firstColumn = new List<string>();
var lastColumn = new List<string>();
// your code for reading CSV file
foreach(var line in file)
{
var array = line.Split(';');
firstColumn.Add(array[0]);
lastColumn.Add(array[1]);
}
var firstArray = firstColumn.ToArray();
var lastArray = lastColumn.ToArray();
Run Code Online (Sandbox Code Playgroud)
小智 5
大家好,我为此创建了一个静态类。+列检查+配额符号删除
public static class CSV
{
public static List<string[]> Import(string file, char csvDelimiter, bool ignoreHeadline, bool removeQuoteSign)
{
return ReadCSVFile(file, csvDelimiter, ignoreHeadline, removeQuoteSign);
}
private static List<string[]> ReadCSVFile(string filename, char csvDelimiter, bool ignoreHeadline, bool removeQuoteSign)
{
string[] result = new string[0];
List<string[]> lst = new List<string[]>();
string line;
int currentLineNumner = 0;
int columnCount = 0;
// Read the file and display it line by line.
using (System.IO.StreamReader file = new System.IO.StreamReader(filename))
{
while ((line = file.ReadLine()) != null)
{
currentLineNumner++;
string[] strAr = line.Split(csvDelimiter);
// save column count of dirst line
if (currentLineNumner == 1)
{
columnCount = strAr.Count();
}
else
{
//Check column count of every other lines
if (strAr.Count() != columnCount)
{
throw new Exception(string.Format("CSV Import Exception: Wrong column count in line {0}", currentLineNumner));
}
}
if (removeQuoteSign) strAr = RemoveQouteSign(strAr);
if (ignoreHeadline)
{
if(currentLineNumner !=1) lst.Add(strAr);
}
else
{
lst.Add(strAr);
}
}
}
return lst;
}
private static string[] RemoveQouteSign(string[] ar)
{
for (int i = 0;i< ar.Count() ; i++)
{
if (ar[i].StartsWith("\"") || ar[i].StartsWith("'")) ar[i] = ar[i].Substring(1);
if (ar[i].EndsWith("\"") || ar[i].EndsWith("'")) ar[i] = ar[i].Substring(0,ar[i].Length-1);
}
return ar;
}
}
Run Code Online (Sandbox Code Playgroud)
我花了几个小时寻找合适的库,但最后我编写了自己的代码 :) 您可以使用任何您想要的工具读取文件(或数据库),然后将以下例程应用于每一行:
private static string[] SmartSplit(string line, char separator = ',')
{
var inQuotes = false;
var token = "";
var lines = new List<string>();
for (var i = 0; i < line.Length; i++) {
var ch = line[i];
if (inQuotes) // process string in quotes,
{
if (ch == '"') {
if (i<line.Length-1 && line[i + 1] == '"') {
i++;
token += '"';
}
else inQuotes = false;
} else token += ch;
} else {
if (ch == '"') inQuotes = true;
else if (ch == separator) {
lines.Add(token);
token = "";
} else token += ch;
}
}
lines.Add(token);
return lines.ToArray();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
782241 次 |
| 最近记录: |