[C#] CSV 파일을 읽고 값을 배열에 저장

파일을 읽으려고합니다 *.csv.

*.csv– 파일들은 세미콜론으로 분리 된 두 열의 구성 ( ” , “).

*.csvStreamReader를 사용 하여 -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이 편집

원래 응답자가 csv2 차원 배열 (배열을 포함하는 배열) 로 채우려 고 시도한 것 같습니다 . 첫 번째 배열의 각 항목에는 해당 특정 열에 대한 데이터가 포함 된 중첩 배열의 각 항목과 해당 행 번호를 나타내는 배열이 포함됩니다.

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];
}