CSV फ़ाइल को पढ़ना और मानों को एक सरणी में संग्रहीत करना


317

मैं *.csv-फाइल पढ़ने की कोशिश कर रहा हूं ।

*.csv-File अर्धविराम द्वारा अलग दो स्तंभों से मिलकर बनता है ( " ; ")।

मैं *.csvStreamReader का उपयोग करके -file पढ़ने और Split()फ़ंक्शन का उपयोग करके प्रत्येक पंक्ति को अलग करने में सक्षम हूं । मैं प्रत्येक कॉलम को एक अलग सरणी में संग्रहीत करना चाहता हूं और फिर इसे प्रदर्शित करता हूं।

क्या यह करना मुमकिन है?


2
@Marc: दुर्भाग्य से गैर-अंग्रेजी संस्कृतियों (जैसे इतालवी) में जब आप CSV को एक्सेल बचाते हैं तो इसे ";"विभाजक के रूप में उपयोग करता है ... इसने CSV को एक गैर-मानक imo बना दिया है :(
डाइजेक्सिल

25
मैं हमेशा CSV को चरित्र-अलग-मूल्यों के रूप में पढ़ता हूं क्योंकि लोग CSV को फाइल कहते हैं, भले ही वे विभाजक के रूप में अल्पविराम का उपयोग न करें। और व्यवहार में विभिन्न उद्धरण या भागने के नियमों के साथ इतनी सारी बोलियाँ हैं कि आप वास्तव में एक मानक की बात नहीं कर सकते हैं, भले ही सिद्धांत में आरएफसी हो।
कोडइन्चोस

1
CSV फ़ाइल एक्सटेंशन नाम को अब DSV में बदल जाना चाहिए - Delimiter सेपरेटेड वैल्यूज़ फ़ाइल
Ambuj

उन सभी उत्तरों के लिए जो केवल सीमांकक चरित्र पर स्ट्रिंग को विभाजित करते हैं, यह जाने का सबसे अच्छा तरीका नहीं है। CSV प्रारूप के और भी नियम हैं जो इसे कवर नहीं करेंगे। एक 3 पार्टी पार्सर का उपयोग करना सबसे अच्छा है। अधिक info- 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
इस के लिए धन्यवाद, मैं भूल गया था कि कैसे एक सीएसवी फ़ाइल में लाइनों को विभाजित करने के लिए (मुझे बेवकूफ!) लेकिन आपके समाधान ने मेरी मदद की :)
हालगान

4
यह 3 साल बाद है और यह सवाल अभी भी किसी की मदद कर रहा है। मुझे बुरा लगता है कि आपको इस पर स्वीकृति नहीं मिली।
एडमएमसी 331

12
अल्पविराम, आदि के साथ क्षेत्र मूल्यों को संभाल नहीं करता है
माइक

12
usingयहां एक खंड का उपयोग करना चाहिए , या बहुत कम से कम मैन्युअल रूप Close()से readerजैसा कि यह एक IDisposibleसंसाधन है।
असफ इजराइल

30
यह भी ठीक से लिखी गई CSV को पार्स नहीं करेगा column1;"Special ; char in string";column3- tools.ietf.org/html/rfc4180
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
मुझे यह विकल्प सबसे अच्छा लगता है। मुझे भागने के पात्रों के बारे में चिंता करने की ज़रूरत नहीं है क्योंकि कक्षा एक सीएसवी पार्सर है और मैन्युअल रूप से निर्मित कुछ नहीं है।
टिमोथी गोंजालेज

22
यदि कोई इसमें भाग Microsoft.VisualBasicलेता है और सोच रहा है, तो आपको फ्रेमवर्क असेंबली का संदर्भ शामिल करना होगा क्योंकि यह आमतौर पर डिफ़ॉल्ट रूप से संदर्भित नहीं होता है।
apokryfos

3
काश, मैंने अपने VB6 दिनों से इसे याद किया होता, तो मुझे वर्षों में बहुत समय बचा होता। जबकि कुछ VB के बारे में शेख़ी करेंगे, मेरे पास dll और namepace को अपने कोड में जोड़ने का कोई मुद्दा नहीं है अगर इसका मूल्य है। यह एक बहुत मूल्य है।
वाल्टर

2
यह समाधान एक होमरुन है। मेरे अनुभव से बहुत विश्वसनीय पार्सर।
ग्लेन फेर्री

3
केवल VB dll में ही क्यों?
मार्क चोई

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

^ ^ गलत - निक द्वारा संपादित

ऐसा प्रतीत होता है कि मूल उत्तरदाता csvएक 2 आयामी सरणी के साथ आबाद करने का प्रयास कर रहा था - एक सरणी जिसमें सरणियाँ हैं। पहले सरणी में प्रत्येक आइटम में एक सरणी होती है, जो उस पंक्ति में प्रत्येक आइटम के साथ उस पंक्ति संख्या का प्रतिनिधित्व करती है, जिसमें उस विशिष्ट कॉलम के लिए डेटा होता है।

var csv = from line in lines
          select (line.Split(',')).ToArray();

2
शायद मुझे कुछ याद आ रहा है, लेकिन मुझे यकीन नहीं है कि आपके सीएसवी चर का क्या मतलब है - क्या आप केवल उसी डेटा संरचना को फिर से नहीं बना रहे हैं जो लाइनों में अल्टर है?
बेन ह्यूजेस

13
@ClayShannon .NET 1.1? मुझे ... आपके लिए बहुत खेद है।
contactmatt

5
@ कॉन्टैक्टमैट: मैं आपको उस भावना से मना नहीं करूंगा।
बी क्ले शैनन

9
मैं यह भी बताना चाहता हूं कि सीएसवी को उद्धृत किया जा सकता है ... इसलिए स्ट्रिंग का उपयोग करना।
एलेक्जेंडर

5
मुझे यह मिल रहा है: 'System.Array' में 'भाजित' के लिए परिभाषा नहीं है और कोई विस्तार विधि 'स्प्लिट' टाइप 'System.Array' के पहले तर्क को स्वीकार नहीं किया जा सकता है (क्या आप एक निर्देश या विधानसभा संदर्भ का उपयोग कर गायब हैं ?)
काला जे

36

आप तुरंत एक सरणी नहीं बना सकते क्योंकि आपको शुरुआत से ही पंक्तियों की संख्या जानने की आवश्यकता है (और इसे दो बार सीएसवी फ़ाइल पढ़ने की आवश्यकता होगी)

आप दो में मान स्टोर कर सकते हैं 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);

एनबी

कृपया ध्यान दें कि यह केवल एक बहुत ही सरल उदाहरण है । उपयोग करना string.Splitउन मामलों के लिए जिम्मेदार नहीं है जहां कुछ रिकॉर्ड में इसके ;अंदर विभाजक होता है।
सुरक्षित दृष्टिकोण के लिए, सीजीएचएलपर जैसे कुछ सीएसवी विशिष्ट पुस्तकालयों का उपयोग करने पर विचार करें।


;मूल्य का एक हिस्सा होने के लिए खाता नहीं है , उदाहरण "value with ; inside it"। CSV मानों को विशेष वर्णों से युक्त करता है जिसमें दोहरे उद्धरण चिह्नों के साथ यह एक शाब्दिक स्ट्रिंग है।
चिकनफेट

1
@ChickenFeet: निश्चित रूप से, यह कैप्शन का कारण है: "बहुत सरल उदाहरण" । वैसे भी मैं उस बारे में एक नोट जोड़ सकते हैं;)
digEmAll

कोई चिंता नहीं, मैंने बहुत सारे अन्य उत्तरों पर ध्यान दिया यहाँ भी इसका कोई हिसाब नहीं है :)
चिकनफीट

1
Regex.Split (sr.ReadLine) (), (; =? (?: [^ \ "] * \" [^ \ "] * \") * [^ \ "] * $)"); // मिला; यह एसओ पर ... एक पुस्तकालय की तुलना में तेज।
चुटकी

34

बस इस लाइब्रेरी में आया: https://github.com/JoshClose/CsvHelper

बहुत सहज और प्रयोग करने में आसान। एक नगेट पैकेज भी है जिसे बनाया गया है जिसे लागू करना जल्दी है: http://nuget.org/packages/CsvHelper/1/7.0 । यह भी सक्रिय रूप से बनाए रखा प्रतीत होता है जो मुझे पसंद है।

सेमी-कोलोन का उपयोग करने के लिए इसे कॉन्फ़िगर करना आसान है: https://github.com/JoshClose/CsvHelper/wiki/Custom-Configurations


3
यह सबसे अच्छा जवाब है! मजबूत पुस्तकालय जिसमें गिरना और उसके साथ रोल करना आसान है।
टायलर फोर्सिथे

3
CsvHelper लाइब्रेरी शानदार है। सुपर त्वरित और प्रयोग करने में आसान।
स्टीव पैरिश

3
यदि आप एक ऐसे पुस्तकालय की तलाश में हैं जो उद्धृत स्ट्रिंग्स सहित सीएसवी प्रारूप के हर पहलू से निपट सकता है, तो इस एक का उपयोग करें। बहुत बढ़िया!
मैट

Thx, वास्तव में अच्छा पुस्तकालय, उपयोग करने में आसान और बहुत मजबूत है।
सेबेस्टियन गुरेरो

2
प्रदर्शन Microsoft.VisualBasic.FileIO.TextFieldParser(cf. @ Habeeb के उत्तर) की तुलना कैसे करता है ?
बोवेंडर

33

मैं आमतौर पर इस पार्सर का उपयोग कोडप्रोजेक्ट से करता हूं , क्योंकि चरित्र का एक गुच्छा बच जाता है और इसी तरह यह मेरे लिए संभालता है।


2
यह बात बहुत अच्छी और तेज है। यदि आप एक व्यावसायिक स्थिति में हैं और क्रैकिंग का उपयोग करने की आवश्यकता है।
gjvdkamp

8
यदि आप इसे डाउनलोड करने के लिए CodeProject के लिए पंजीकरण नहीं करना चाहते हैं तो यह पार्सर लुमेनवॉर्क्स.फ्रैमवर्क.IO के रूप में नुगेट गैलरी में उपलब्ध है।
ग्रेग मैककॉय

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

आप सीएसवी चर में पंक्तियों और स्तंभों का उपयोग कैसे करते हैं?
मैथ्यू लॉक

1
आप कोमा से कैसे बच सकते हैं?
कुआंगवेई झांग

स्तंभों के भीतर अल्पविराम नहीं संभालता है। जोश के जवाब के अनुसार मजबूत पुस्तकालय CsvHelper का उपयोग करने के लिए बेहतर है
टिम पार्ट्रिज

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

यदि आप इसे आगे की प्रक्रिया करने से पहले डेटा को आकार देने की आवश्यकता है, तो यह काफी उपयोगी है (पहली 2 पंक्तियों को शीर्षक से मिलकर, और पहला कॉलम एक पंक्ति शीर्षक है - जिसे आपको सरणी में रखने की आवश्यकता नहीं है क्योंकि आप सिर्फ इसलिए डेटा का संबंध चाहते हैं)।

NB आप आसानी से निम्नलिखित कोड का उपयोग करके सुर्खियाँ और 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

यह कोड उदाहरण आपकी *.csvफ़ाइल की निम्न संरचना को मानता है :

सीएसवी मैट्रिक्स

नोट: यदि आपको खाली पंक्तियों को छोड़ने की आवश्यकता है - जो कभी-कभी काम कर सकते हैं, तो आप सम्मिलित करके ऐसा कर सकते हैं

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

LINQ कोड उदाहरणों में fromऔर selectकथन के बीच ।


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
यह उतना कुशल नहीं है क्योंकि स्प्लिट वह सब कुछ नहीं करता है जो TextFieldParser करता है। उदाहरण के लिए, टिप्पणी लाइनों को छोड़ें, उद्धृत क्षेत्रों को संभालें, और व्हाट्सएप की शुरुआत / अनुगामी निकालें। बिल्कुल नहीं 1: 1 तुलना।
रॉबर्ट मैककी

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

आपकी सहायता के लिए धन्यवाद। यह मेरी समस्या को हल करने में मदद कर सकता है। दरअसल मुझे फाइल से डेटा पढ़ना है और फिर डेटाबेस में डालना है। डालने के समय मुझे प्राथमिक कुंजी बाधा त्रुटि मिल रही है (क्योंकि मेरे पास पहले से ही डेटाबेस में डेटा है)। तो, मुझे ऐसे प्रोग्राम करने की आवश्यकता है जो पहले से मौजूद चर के साथ फिर डेटा को अपडेट करें।
रुषभ शाह

अगर पीके - आपको डेटाबेस से आईडी द्वारा एक रिकॉर्ड प्राप्त करने की आवश्यकता है और यदि यह एक अद्यतन विवरण जारी करने की तुलना में मौजूद है, तो अन्यथा एक नया रिकॉर्ड सम्मिलित करने के लिए मेरा पहला मूल्य है।
जैकब कोनकी

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

ओपन-सोर्स अंगारा.टेबल लाइब्रेरी 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 असेंबली का संदर्भ जोड़ने की आवश्यकता हो सकती है; परियोजना पर 'संदर्भ जोड़ें' पर क्लिक करें और "एसेंबलीज़" -> "एक्सटेंशन" के तहत 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

मैं सिर्फ अपने मास्टर की थीसिस पर काम कर रहा छात्र हूं, लेकिन यह तरीका है जिसे मैंने इसे हल किया है और इसने मेरे लिए अच्छा काम किया है। पहले आप अपनी फाइल को डायरेक्टरी (सिर्फ़ सीएसवी फॉर्मेट में) से चुनें और फिर आप डेटा को सूचियों में डाल दें।

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
स्तंभ मान के अंदर नई सुर्खियाँ होने पर यह इस मामले को नहीं संभालता है;)
एमिल

0

मेरे पास एक पुस्तकालय है जो बिल्कुल आपकी आवश्यकता है।

कुछ समय पहले मैंने CSV फ़ाइलों के साथ काम के लिए सरल और तेज़ पर्याप्त लाइब्रेरी लिखी थी। आप इसे निम्न लिंक से पा सकते हैं: https://github.com/ukushu/DataExporter

यह 2 आयाम सरणी के साथ CSV की तरह काम करता है। ठीक वैसे ही जैसे आपको जरूरत है।

उदाहरण के लिए, यदि आपको 3 पंक्ति के सभी मानों की आवश्यकता है, तो आपको केवल यह लिखना होगा:

Csv csv = new Csv();

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

var allValuesOf3rdRow = csv.Rows[2];

या के 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>();


    }
}

}

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.