CSV 파일을 읽고 값을 배열에 저장


317

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

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

*.csvStreamReader를 사용 하여 -file 을 읽을 수 있으며 Split()함수 를 사용하여 각 줄을 구분할 수 있습니다. 각 열을 별도의 배열에 저장하고 표시하고 싶습니다.

그렇게 할 수 있습니까?


2
@Marc : 불행히도 영어 이외의 문화 (예 : 이탈리아어)에서는 엑셀을 CSV로 저장하면 ";"구분자로 사용 됩니다. 이렇게하면 CSV가 비표준 imo가되었습니다. (
digEmAll

25
사람들이 쉼표를 구분 기호로 사용하지 않더라도 CSV 파일을 호출하기 때문에 항상 CSV를 문자 분리 값으로 읽습니다. 그리고 실제로 다른 인용 또는 이스케이프 규칙이있는 방언이 너무 많아 이론 상으로는 RFC가 있어도 실제로 표준에 대해 이야기 할 수 없습니다.
코드 InChaos

1
CSV 파일 확장자 이름은 이제 DSV에 변화를 얻어야한다 - 구분 기호 값 분리 된 파일
Ambuj

구분 문자에서 문자열을 단순히 나누는 모든 대답에 대해 이것이 최선의 방법은 아닙니다. CSV 형식에는 다루지 않을 규칙이 더 있습니다. 타사 파서를 사용하는 것이 가장 좋습니다. 더 많은 정보 -dotnetcoretutorials.com/2018/08/04/csv-parsing-in-net-core
iliketocode

답변:


415

다음과 같이 할 수 있습니다 :

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

5
(! 바보 같은 나) 이에 대한 감사는 :) 내가 어떻게 csv 파일의 분할 선에 까맣게 잊고 있지만 해결책은 나에게 도움이
Hallaghan

4
3 년이 지난 지금이 ​​질문은 여전히 ​​누군가를 돕고 있습니다. 당신이 이것에 동의하지 않은 것이 기분이 좋지 않습니다.
AdamMc331

12
쉼표 등으로 필드 값을 처리하지 않습니다.
Mike

12
용도해야 using여기에 절을하거나, 적어도 수동으로 그것을로의 자원. Close()readerIDisposible
Assaf Israel

30
이것은 또한 다음과 같이 작성된 CSV를 올바르게 구문 분석하지 않습니다. column1;"Special ; char in string";column3- tools.ietf.org
Ole K

173

내가 좋아하는 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


6
이 옵션이 가장 좋습니다. 클래스는 CSV 파서이며 수동으로 작성되는 것이 아니기 때문에 이스케이프 문자에 대해 걱정할 필요가 없습니다.
Timothy Gonzalez

22
누군가이 문제에 직면하여 궁금해하는 경우 Microsoft.VisualBasic일반적으로 기본적으로 참조되지 않으므로 프레임 워크 어셈블리에 대한 참조를 포함해야합니다 .
apokryfos 2012

3
나는 내 VB6 일에서 이것을 기억하고 수년에 걸쳐 많은 시간을 절약했을 것입니다. 일부는 VB에 대해 불평하지만 값이 있으면 코드에 dll 및 네임 스페이스를 추가하는 데 아무런 문제가 없습니다. 이것은 많은 가치가 있습니다.
Walter

2
이 솔루션은 홈런입니다. 내 경험에서 매우 신뢰할 수있는 파서.
Glenn Ferrie

3
왜 VB dll에만 있습니까?
Mark Choi

75

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();

2
어쩌면 내가 누락 된 것이지만 csv 변수의 요점이 무엇인지 확실하지 않습니다. 이미 줄에있는 동일한 데이터 구조를 다시 만드는 것이 아닙니까?
벤 휴즈

13
@ClayShannon .NET 1.1? 죄송합니다. 정말 죄송합니다.
contactmatt

5
@contactmatt : 나는 그 정서를 무시하지 않을 것입니다.
B. Clay Shannon

9
또한 csv가 인용 될 수 있음을 지적하고 싶습니다 ... string.Split을 사용하는 것은 실행 가능한 옵션이 아닙니다.
Alxandr

5
'System.Array'에 'Split'에 대한 정의가 포함되어 있지 않으며 'System.Array'유형의 첫 번째 인수를 허용하는 확장 방법 'Split'을 찾을 수 없습니다 (사용 지시문 또는 어셈블리 참조가 누락 되었습니까? ?)
Kala J

36

처음부터 행 수를 알아야하기 때문에 즉시 배열을 만들 수 없습니다 (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 전용 라이브러리를 사용하십시오.


;예를 들어 값의 일부가되는 것은 아닙니다 "value with ; inside it". 리터럴 문자열을 나타 내기 위해 큰 따옴표가있는 특수 문자를 포함하는 CSV 서라운드 값.
ChickenFeet

1
@ChickenFeet : 자막의 이유는 "아주 간단한 예" 입니다. 어쨌든 나는 그것에 대해 메모를 추가 할 수 있습니다;)
digEmAll

걱정 마, 내가 :) 또한 고려하지 않습니다 여기에 다른 답변을 많이 발견하지
닭발

1
Regex.Split (sr.ReadLine (), ", (? = (? : [^ \"] * \ "[^ \"] * \ ") * [^ \"] * $) "); // 발견 도서관에 비해 이보다 더 빠릅니다.
Pinch

34

이 라이브러리를 보았습니다 : https://github.com/JoshClose/CsvHelper

매우 직관적이고 사용하기 쉽습니다. 너겟 패키지도 너무 빨리 구현했다 : http://nuget.org/packages/CsvHelper/1.17.0 . 또한 내가 좋아하는 적극적으로 유지되는 것처럼 보입니다.

세미콜론을 사용하도록 쉽게 구성 할 수 있습니다 : https://github.com/JoshClose/CsvHelper/wiki/Custom-Configurations


3
이것이 가장 좋은 대답입니다! 쉽게 넣을 수있는 견고한 라이브러리.
Tyler Forsythe

3
CsvHelper 라이브러리는 환상적입니다. 매우 빠르고 사용하기 쉽습니다.
Steve Parish

3
인용 문자열을 포함하여 csv 형식의 모든 측면을 처리 할 수있는 라이브러리를 찾으려면이 라이브러리를 사용하십시오. 대박!
Matt

Thx, 정말 멋진 라이브러리, 사용하기 쉽고 매우 견고합니다.
Sebastián Guerrero

2
성능은 어떻게 비교 Microsoft.VisualBasic.FileIO.TextFieldParser됩니까 (@Habeeb의 답변 참조)?
bovender

33

나는 일반적으로 codeproject 에서이 파서를 사용합니다 . 왜냐하면 많은 문자 이스케이프와 비슷한 것이 있기 때문입니다.


2
이것은 매우 좋고 빠릅니다. 비즈니스 상황에 처해 있고 크래킹이 필요한 경우이를 사용하십시오.
gjvdkamp

8
이 파서는 Nuget 갤러리에서 LumenWorks.Framework.IO로 사용할 수 있습니다. CodeProject를 다운로드하여 등록하지 않으려는 경우에 대비합니다.
Greg McCoy

30

다음은 가장 많이 투표 된 답변의 변형입니다.

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

csv 변수의 행과 열에 어떻게 액세스합니까?
Matthew Lock

1
탈출 쉼표를 어떻게 처리합니까?
Kuangwei Zhang 2016 년

열 내에서 쉼표를 처리하지 않습니다. 더 나은 강력한 라이브러리 사용 CsvHelper 당 joshb의 같은 대답
팀 파트 리지

11

(헤드 라인) 및 / 또는 열을 건너 뛰어야하는 경우이를 사용하여 2 차원 배열을 만들 수 있습니다.

    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

이것은 데이터를 더 처리하기 전에 데이터를 구체화 해야하는 경우에 매우 유용합니다 (처음 두 줄이 헤드 라인으로 구성되고 첫 번째 열이 행 제목이라고 가정하면 배열에 없어도됩니다. 데이터를 고려하고 싶습니다).

NB 다음 코드를 사용하여 헤드 라인과 첫 번째 열을 쉽게 얻을 수 있습니다.

    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

이 코드 예제는 다음과 같은 *.csv파일 구조를 가정 합니다.

CSV 매트릭스

참고 : 빈 행을 건너 뛸 필요가있는 경우-때로는 편리하게 삽입 할 수 있습니다.

    where line.Any(a=>!string.IsNullOrWhiteSpace(a))

위 의 LINQ 코드 예제 에서 fromselect문 사이


10

성능 향상을 위해 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;
}

9
Split은 TextFieldParser가 수행하는 모든 작업을 수행하지 않기 때문에 비효율적입니다. 예를 들어, 주석 행을 건너 뛰고 인용 된 필드를 처리하고 시작 / 후행 공백을 제거하십시오. 정확히 1 : 1 비교는 아닙니다.
Robert McKee

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

}

4
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();

당신의 도움을 주셔서 감사합니다. 내 문제를 해결하는 데 도움이 될 수 있습니다. 실제로 나는 파일에서 데이터를 읽고 데이터베이스에 삽입해야합니다. 삽입 할 때 이미 데이터베이스에 데이터가 있으므로 기본 키 제약 조건 오류가 발생합니다. 따라서 변수가 이미 존재하도록 프로그래밍 한 다음 데이터를 업데이트해야합니다.
Rushabh Shah

PK 인 경우 첫 번째 값을 가정합니다. 데이터베이스에서 ID로 레코드를 가져와야하며 UPDATE 문을 발행하는 것보다 존재하는 경우 새 레코드를 삽입하십시오.
Jakub Konecki

3

다음은 데이터 필드 중 하나에 세미콜론 ( ";")이 데이터의 일부로 포함 된 특별한 경우입니다.이 경우 위의 대부분의 답변이 실패합니다.

해결책은 그 경우가 될 것입니다

string[] csvRows = System.IO.File.ReadAllLines(FullyQaulifiedFileName);
string[] fields = null;
List<string> lstFields;
string field;
bool quoteStarted = false;
foreach (string csvRow in csvRows)
{
    lstFields = new List<string>();
    field = "";
    for (int i = 0; i < csvRow.Length; i++)
    {
        string tmp = csvRow.ElementAt(i).ToString();
        if(String.Compare(tmp,"\"")==0)
        {
            quoteStarted = !quoteStarted;
        }
        if (String.Compare(tmp, ";") == 0 && !quoteStarted)
        {
            lstFields.Add(field);
            field = "";
        }
        else if (String.Compare(tmp, "\"") != 0)
        {
            field += tmp;
        }
    }
    if(!string.IsNullOrEmpty(field))
    {
        lstFields.Add(field);
        field = "";
    }
// This will hold values for each column for current row under processing
    fields = lstFields.ToArray(); 
}

2

오픈 소스 Angara.Table 라이브러리를 사용하면 CSV를 유형이 지정된 열에로드 할 수 있으므로 열에서 배열을 가져올 수 있습니다. 각 열은 이름 또는 색인으로 색인화 할 수 있습니다. http://predictionmachines.github.io/Angara.Table/saveload.html을 참조 하십시오 .

라이브러리는 CSV의 RFC4180을 따릅니다. 형식 유추 및 여러 줄 문자열을 활성화합니다.

예:

using System.Collections.Immutable;
using Angara.Data;
using Angara.Data.DelimitedFile;

...

ReadSettings settings = new ReadSettings(Delimiter.Semicolon, false, true, null, null);
Table table = Table.Load("data.csv", settings);
ImmutableArray<double> a = table["double-column-name"].Rows.AsReal;

for(int i = 0; i < a.Length; i++)
{
    Console.WriteLine("{0}: {1}", i, a[i]);
}

열 유형을 사용하여 열 유형을 볼 수 있습니다. 예 :

Column c = table["double-column-name"];
Console.WriteLine("Column {0} is double: {1}", c.Name, c.Rows.IsRealColumn);

라이브러리는 F #에 중점을 두므로 FSharp.Core 4.4 어셈블리에 대한 참조를 추가해야합니다. 프로젝트에서 'Add Reference'를 클릭하고 "Assemblies"-> "Extensions"에서 FSharp.Core 4.4를 선택하십시오.


2

올바른 라이브러리를 검색하는 데 몇 시간을 소비했지만 마침내 내 코드를 작성했습니다. 원하는 도구를 사용하여 파일 (또는 데이터베이스)을 읽은 다음 각 라인에 다음 루틴을 적용 할 수 있습니다.

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();
}

1

나는 수년간 csvreader.com (유료 구성 요소)을 사용해 왔으며 아무런 문제가 없었습니다. 단단하고 빠르며 빠르지 만 지불해야합니다. 구분 기호를 원하는대로 설정할 수 있습니다.

using (CsvReader reader = new CsvReader(s) {
    reader.Settings.Delimiter = ';';
    reader.ReadHeaders();  // if headers on a line by themselves.  Makes reader.Headers[] available
    while (reader.ReadRecord())
        ... use reader.Values[col_i] ...
}

1

나는 단지 석사 논문을 연구하는 학생이지만, 이것이 내가 그것을 해결하는 방법이며 그것은 나를 위해 잘 작동했습니다. 먼저 디렉토리에서 파일을 선택하고 (csv 형식으로 만) 데이터를 목록에 넣습니다.

List<float> t = new List<float>();
List<float> SensorI = new List<float>();
List<float> SensorII = new List<float>();
List<float> SensorIII = new List<float>();
using (OpenFileDialog dialog = new OpenFileDialog())
{
    try
    {
        dialog.Filter = "csv files (*.csv)|*.csv";
        dialog.Multiselect = false;
        dialog.InitialDirectory = ".";
        dialog.Title = "Select file (only in csv format)";
        if (dialog.ShowDialog() == DialogResult.OK)
        {
            var fs = File.ReadAllLines(dialog.FileName).Select(a => a.Split(';'));
            int counter = 0;
            foreach (var line in fs)
            {
                counter++;
                if (counter > 2)    // Skip first two headder lines
                {
                    this.t.Add(float.Parse(line[0]));
                    this.SensorI.Add(float.Parse(line[1]));
                    this.SensorII.Add(float.Parse(line[2]));
                    this.SensorIII.Add(float.Parse(line[3]));
                }
            }
        }
    }
    catch (Exception exc)
    {
        MessageBox.Show(
            "Error while opening the file.\n" + exc.Message, 
            this.Text, 
            MessageBoxButtons.OK, 
            MessageBoxIcon.Error
        );
    }
}

0

여전히 틀렸다. 따옴표로 ""를 보완해야합니다. 여기 내 솔루션 Microsoft 스타일 CSV가 있습니다.

               /// <summary>
    /// Microsoft style csv file.  " is the quote character, "" is an escaped quote.
    /// </summary>
    /// <param name="fileName"></param>
    /// <param name="sepChar"></param>
    /// <param name="quoteChar"></param>
    /// <param name="escChar"></param>
    /// <returns></returns>
    public static List<string[]> ReadCSVFileMSStyle(string fileName, char sepChar = ',', char quoteChar = '"')
    {
        List<string[]> ret = new List<string[]>();

        string[] csvRows = System.IO.File.ReadAllLines(fileName);

        foreach (string csvRow in csvRows)
        {
            bool inQuotes = false;
            List<string> fields = new List<string>();
            string field = "";
            for (int i = 0; i < csvRow.Length; i++)
            {
                if (inQuotes)
                {
                    // Is it a "" inside quoted area? (escaped litteral quote)
                    if(i < csvRow.Length - 1 && csvRow[i] == quoteChar && csvRow[i+1] == quoteChar)
                    {
                        i++;
                        field += quoteChar;
                    }
                    else if(csvRow[i] == quoteChar)
                    {
                        inQuotes = false;
                    }
                    else
                    {
                        field += csvRow[i];
                    }
                }
                else // Not in quoted region
                {
                     if (csvRow[i] == quoteChar)
                    {
                        inQuotes = true;
                    }
                    if (csvRow[i] == sepChar)
                    {
                        fields.Add(field);
                        field = "";
                    }
                    else 
                    {
                        field += csvRow[i];
                    }
                }
            }
            if (!string.IsNullOrEmpty(field))
            {
                fields.Add(field);
                field = "";
            }
            ret.Add(fields.ToArray());
        }

        return ret;
    }
}

3
열 값 안에 줄 바꿈이있는 경우에는 처리되지 않습니다.;)
Emil

0

정확히 필요한 일을하는 도서관이 있습니다.

얼마 전에 저는 CSV 파일 작업을위한 간단하고 빠른 라이브러리를 작성했습니다. 다음 링크에서 찾을 수 있습니다 : https://github.com/ukushu/DataExporter

2 차원 배열과 같은 CSV로 작동합니다. 정확히 당신이 필요로합니다.

예를 들어, 세 번째 행의 모든 ​​값이 필요한 경우 다음과 같이 작성하면됩니다.

Csv csv = new Csv();

csv.FileOpen("c:\\file1.csv");

var allValuesOf3rdRow = csv.Rows[2];

또는의 두 번째 셀을 읽으려면

var value = csv.Rows[2][1];

-1

이거 봐요

CsvFramework 사용;

System.Collections.Generic 사용;

네임 스페이스 CvsParser {

public class Customer
{
    public int Id { get; set; }
    public string Name { get; set; }
    public List<Order> Orders { get; set; }        
}

public class Order
{
    public int Id { get; set; }

    public int CustomerId { get; set; }
    public int Quantity { get; set; }

    public int Amount { get; set; }

    public List<OrderItem> OrderItems { get; set; }

}

public class Address
{
    public int Id { get; set; }
    public int CustomerId { get; set; }

    public string Name { get; set; }
}

public class OrderItem
{
    public int Id { get; set; }
    public int OrderId { get; set; }

    public string ProductName { get; set; }
}

class Program
{
    static void Main(string[] args)
    {

        var customerLines = System.IO.File.ReadAllLines(@"Customers.csv");
        var orderLines = System.IO.File.ReadAllLines(@"Orders.csv");
        var orderItemLines = System.IO.File.ReadAllLines(@"OrderItemLines.csv");

        CsvFactory.Register<Customer>(builder =>
        {
            builder.Add(a => a.Id).Type(typeof(int)).Index(0).IsKey(true);
            builder.Add(a => a.Name).Type(typeof(string)).Index(1);
            builder.AddNavigation(n => n.Orders).RelationKey<Order, int>(k => k.CustomerId);

        }, false, ',', customerLines);

        CsvFactory.Register<Order>(builder =>
        {
            builder.Add(a => a.Id).Type(typeof(int)).Index(0).IsKey(true);
            builder.Add(a => a.CustomerId).Type(typeof(int)).Index(1);
            builder.Add(a => a.Quantity).Type(typeof(int)).Index(2);
            builder.Add(a => a.Amount).Type(typeof(int)).Index(3);
            builder.AddNavigation(n => n.OrderItems).RelationKey<OrderItem, int>(k => k.OrderId);

        }, true, ',', orderLines);


        CsvFactory.Register<OrderItem>(builder =>
        {
            builder.Add(a => a.Id).Type(typeof(int)).Index(0).IsKey(true);
            builder.Add(a => a.OrderId).Type(typeof(int)).Index(1);
            builder.Add(a => a.ProductName).Type(typeof(string)).Index(2);


        }, false, ',', orderItemLines);



        var customers = CsvFactory.Parse<Customer>();


    }
}

}

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.