파일을 읽으려고합니다 *.csv
.
*.csv
– 파일들은 세미콜론으로 분리 된 두 열의 구성 ( ” , “).
*.csv
StreamReader를 사용 하여 -file 을 읽을 수 있으며 Split()
함수 를 사용하여 각 줄을 구분할 수 있습니다. 각 열을 별도의 배열에 저장하고 표시하고 싶습니다.
그렇게 할 수 있습니까?
답변
다음과 같이 할 수 있습니다 :
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]);
}
}
}
답변
내가 좋아하는 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];
}
}
참조를 추가해야합니다 Microsoft.VisualBasic
파서에 대한 자세한 내용은 여기에 있습니다 : http://codeskaters.blogspot.ae/2015/11/c-easiest-csv-parser-built-in-net.html
답변
LINQ 방식 :
var lines = File.ReadAllLines("test.txt").Select(a => a.Split(';'));
var csv = from line in lines
select (from piece in line
select piece);
^^ 잘못-Nick이 편집
원래 응답자가 csv
2 차원 배열 (배열을 포함하는 배열) 로 채우려 고 시도한 것 같습니다 . 첫 번째 배열의 각 항목에는 해당 특정 열에 대한 데이터가 포함 된 중첩 배열의 각 항목과 해당 행 번호를 나타내는 배열이 포함됩니다.
var csv = from line in lines
select (line.Split(',')).ToArray();
답변
처음부터 행 수를 알아야하기 때문에 즉시 배열을 만들 수 없습니다 (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);
NB
이것은 매우 간단한 예일 뿐입니다 . string.Split
일부 레코드에는 분리 기호가 포함 된 경우를 사용 하지 않습니다 ;
.
보다 안전한 접근을 위해서는 nuget에서 CsvHelper와 같은 일부 CSV 전용 라이브러리를 사용하십시오.
답변
이 라이브러리를 보았습니다 : https://github.com/JoshClose/CsvHelper
매우 직관적이고 사용하기 쉽습니다. 너겟 패키지도 너무 빨리 구현했다 : http://nuget.org/packages/CsvHelper/1.17.0 . 또한 내가 좋아하는 적극적으로 유지되는 것처럼 보입니다.
세미콜론을 사용하도록 쉽게 구성 할 수 있습니다 : https://github.com/JoshClose/CsvHelper/wiki/Custom-Configurations
답변
나는 일반적으로 codeproject 에서이 파서를 사용합니다 . 왜냐하면 많은 문자 이스케이프와 비슷한 것이 있기 때문입니다.
답변
다음은 가장 많이 투표 된 답변의 변형입니다.
var contents = File.ReadAllText(filename).Split('\n');
var csv = from line in contents
select line.Split(',').ToArray();
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];
}