.NET में सीएसवी फ़ाइल आयात

मुझे एहसास है कि यह एक नौसिखिया सवाल है, लेकिन मैं एक साधारण समाधान की तलाश में हूं - ऐसा लगता है कि एक होना चाहिए।

एक सीएसवी फ़ाइल को दृढ़ता से टाइप की गई डेटा संरचना में आयात करने का सबसे अच्छा तरीका क्या है? फिर सरल = बेहतर।

0
जोड़ा संपादित
विचारों: 1
इसे ध्यान में रखते हुए 11034 9 5 से एक साल पहले बनाया गया था, मुझे लगता है कि सवाल इस का एक डुप्लिकेट है।
जोड़ा लेखक MattH, स्रोत
जोड़ा लेखक Mark Meuer, स्रोत
धन्यवाद, मैट। मैं बस उन्हें एक साथ जोड़ने की कोशिश कर रहा था, यह इंगित नहीं करता कि कौन सा पहले आया था। आप देखेंगे कि मेरे पास इस पर इशारा करते हुए दूसरे प्रश्न पर बिल्कुल वही पाठ है। क्या दो प्रश्नों को एक साथ बांधने का एक बेहतर तरीका है?
जोड़ा लेखक Mark Meuer, स्रोत

12 उत्तर

यदि आप गारंटी दे सकते हैं कि डेटा में कोई कॉमा नहीं है, तो शायद सबसे आसान तरीका String.split

उदाहरण के लिए:

String[] values = myString.Split(',');
myObject.StringField = values[0];
myObject.IntField = Int32.Parse(values[1]);

ऐसे पुस्तकालय हो सकते हैं जिनका उपयोग आप मदद के लिए कर सकते हैं, लेकिन यह संभवतः उतना सरल है जितना आप प्राप्त कर सकते हैं। बस सुनिश्चित करें कि आपके पास डेटा में अल्पविराम नहीं हो सकता है, अन्यथा आपको इसे बेहतर तरीके से पार्स करने की आवश्यकता होगी।

0
जोड़ा
स्मृति उपयोग और बहुत सारे ओवरहेड पर बहुत बुरा है। कुछ कम किलोबाइट्स कम होना चाहिए। निश्चित रूप से 10 एमबी सीएसवी के लिए अच्छा नहीं है!
जोड़ा लेखक ppumkin, स्रोत
यह एक इष्टतम समाधान नहीं है
जोड़ा लेखक roundcrisis, स्रोत
यह आपकी स्मृति और फ़ाइल के आकार पर निर्भर करता है।
जोड़ा लेखक tonymiao, स्रोत

ब्रायन इसे दृढ़ता से टाइप किए गए संग्रह में बदलने के लिए एक अच्छा समाधान देता है।

दिए गए अधिकांश सीएसवी पार्सिंग विधियों में सीएसवी फाइलों (जैसे फ़ील्ड ट्रिमिंग) की खेतों से बचने वाले कुछ अन्य उप-समूहों में शामिल नहीं हैं। यहां वह कोड है जिसका मैं व्यक्तिगत रूप से उपयोग करता हूं। यह किनारों के चारों ओर थोड़ा मोटा है और इसमें बहुत अधिक त्रुटि रिपोर्टिंग नहीं है।

public static IList> Parse(string content)
{
    IList> records = new List>();

    StringReader stringReader = new StringReader(content);

    bool inQoutedString = false;
    IList record = new List();
    StringBuilder fieldBuilder = new StringBuilder();
    while (stringReader.Peek() != -1)
    {
        char readChar = (char)stringReader.Read();

        if (readChar == '\n' || (readChar == '\r' && stringReader.Peek() == '\n'))
        {
            // If it's a \r\n combo consume the \n part and throw it away.
            if (readChar == '\r')
            {
                stringReader.Read();
            }

            if (inQoutedString)
            {
                if (readChar == '\r')
                {
                    fieldBuilder.Append('\r');
                }
                fieldBuilder.Append('\n');
            }
            else
            {
                record.Add(fieldBuilder.ToString().TrimEnd());
                fieldBuilder = new StringBuilder();

                records.Add(record);
                record = new List();

                inQoutedString = false;
            }
        }
        else if (fieldBuilder.Length == 0 && !inQoutedString)
        {
            if (char.IsWhiteSpace(readChar))
            {
                // Ignore leading whitespace
            }
            else if (readChar == '"')
            {
                inQoutedString = true;
            }
            else if (readChar == ',')
            {
                record.Add(fieldBuilder.ToString().TrimEnd());
                fieldBuilder = new StringBuilder();
            }
            else
            {
                fieldBuilder.Append(readChar);
            }
        }
        else if (readChar == ',')
        {
            if (inQoutedString)
            {
                fieldBuilder.Append(',');
            }
            else
            {
                record.Add(fieldBuilder.ToString().TrimEnd());
                fieldBuilder = new StringBuilder();
            }
        }
        else if (readChar == '"')
        {
            if (inQoutedString)
            {
                if (stringReader.Peek() == '"')
                {
                    stringReader.Read();
                    fieldBuilder.Append('"');
                }
                else
                {
                    inQoutedString = false;
                }
            }
            else
            {
                fieldBuilder.Append(readChar);
            }
        }
        else
        {
            fieldBuilder.Append(readChar);
        }
    }
    record.Add(fieldBuilder.ToString().TrimEnd());
    records.Add(record);

    return records;
}

ध्यान दें कि यह दोहरे उद्धरणों द्वारा सीमित नहीं किए जा रहे फ़ील्ड के एज केस को संभाल नहीं करता है, लेकिन मेरले के अंदर उद्धृत स्ट्रिंग है। एक बेहतर विस्तार के साथ-साथ कुछ लिंक के लिए यह पोस्ट देखें कुछ उचित पुस्तकालयों।

0
जोड़ा

कोडप्रोजेक्ट पर दो लेख हैं जो समाधान के लिए कोड प्रदान करते हैं, जो कि StreamReader और वह < आयात CSV डेटा //support.microsoft.com/kb/187670 "rel =" nofollow noreferrer "> माइक्रोसॉफ़्ट टेक्स्ट ड्राइवर ।

0
जोड़ा

यदि आप सीएसवी पार्सिंग के लिए काफी जटिल परिदृश्य की उम्मीद कर रहे हैं, तो अपने स्वयं के पार्सर को घुमाने के बारे में भी सोचें । वहां बहुत सारे बेहतरीन टूल हैं, जैसे FileHelpers , या यहां तक ​​कि CodeProject

मुद्दा यह है कि यह एक आम समस्या है और आप शर्त लगा सकते हैं कि सॉफ़्टवेयर डेवलपर्स के बहुत ने पहले ही इस समस्या के बारे में सोचा है और हल किया है।

0
जोड़ा
धन्यवाद @techspider मुझे उम्मीद है कि आपने यह नोट किया था कि यह पोस्ट स्टैक ओवरफ्लो की बीटा अवधि से थी: डी कहा जा रहा है कि आजकल सीएसवी टूल्स को नूजेट पैकेज से बेहतर तरीके से सोर्स किया गया है - इसलिए मुझे यकीन नहीं है कि लिंक जवाब भी 8 साल से प्रतिरक्षा हैं प्रौद्योगिकी के विकास के चक्र चक्र
जोड़ा लेखक Jon Limjap, स्रोत
हालांकि यह लिंक प्रश्न का उत्तर दे सकता है, लेकिन यहां उत्तर के आवश्यक हिस्सों को शामिल करना बेहतर है और संदर्भ के लिए लिंक प्रदान करना बेहतर है। लिंक किए गए पृष्ठ में परिवर्तन होने पर लिंक-केवल उत्तर अमान्य हो सकते हैं। - समीक्षा से
जोड़ा लेखक techspider, स्रोत
0
जोड़ा
+1 बस इसे लागू किया ... भयानक
जोड़ा लेखक Miyagi Coder, स्रोत
@ डांगफ मुझे नहीं लगता कि यह काफी सच है। opensource.org/licenses/lgpl-2.1.php कहता है "हालांकि, लिंकिंग लाइब्रेरी के साथ "लाइब्रेरी का उपयोग करने वाला एक काम" निष्पादन योग्य बनाता है जो लाइब्रेरी का व्युत्पन्न होता है ... इसलिए निष्पादन योग्य इस लाइसेंस द्वारा कवर किया जाता है। धारा 6 ऐसे निष्पादन योग्य वितरण के लिए शर्तों को बताता है। "
जोड़ा लेखक RYFN, स्रोत
@ डांगफ मैं सहमत हूं, मुझे यकीन नहीं है कि इसे क्या करना है!
जोड़ा लेखक RYFN, स्रोत
@ जॉन, तुम ऐसा क्यों कहते हो? एलजीपीएल को आपको तब तक कोई कोड जारी करने की आवश्यकता नहीं है जब तक आप लाइब्रेरी को संशोधित न करें। (इस मामले में वैसे भी एक पैच जमा करने के लिए समझ में आता है।)
जोड़ा लेखक dan-gph, स्रोत
@ ज़ीउस, मुझे अभी भी नहीं लगता कि आपको अपने "काम जो लाइब्रेरी का उपयोग करता है" का स्रोत जारी करना होगा। आपको "ऑब्जेक्ट कोड और / या स्रोत कोड" जारी करने की आवश्यकता है। मुझे यकीन नहीं है कि इसका मतलब नेट नेटवर्क में क्या है। लेकिन आप सही हैं। धारा 6 की आवश्यकताओं बेहद खतरनाक हैं। क्या हास्यास्पद लाइसेंस है।
जोड़ा लेखक dan-gph, स्रोत
ऐसा लगता है कि फाइलहेल्पर के साथ एक और समस्या यह है कि 2007 के बाद से इसका विकास पूरी तरह से बंद हो गया है। और दुर्भाग्य से इसमें बग शामिल हैं। (शायद यह साधारण मामलों के लिए ठीक काम करेगा।) हालांकि यह खुला स्रोत है, यह स्पष्ट नहीं है कि लेखक पैच स्वीकार कर रहा है।
जोड़ा लेखक dan-gph, स्रोत
दुर्भाग्यवश यह एलजीपीएल है, जो कॉर्पोरेट वातावरण में आदर्श से कम है ...
जोड़ा लेखक John Weldon, स्रोत
तुलना के लिए, एनएचबीर्नेट भी एलजीपीएल है और इसका उपयोग अनगिनत वाणिज्यिक ऐप्स में किया गया है। तो चिंता करने के लिए कुछ भी नहीं है।
जोड़ा लेखक Mauricio Scheffer, स्रोत
@ डांगफ @ ज़ीउस @ जॉन @ मार्टिन सेक्शन 6 बी का कहना है कि आपको लाइब्रेरी से जोड़ने के लिए एक उपयुक्त साझा लाइब्रेरी तंत्र का उपयोग करने की अनुमति है। एक उपयुक्त तंत्र वह है जो (1) रन टाइम पर उपयोग करता है लाइब्रेरी की एक प्रति पहले से मौजूद है उपयोगकर्ता के कंप्यूटर सिस्टम, निष्पादन योग्य में लाइब्रेरी फ़ंक्शंस की प्रतिलिपि बनाने के बजाय, और (2) लाइब्रेरी के एक संशोधित संस्करण के साथ ठीक से काम करेगा, यदि उपयोगकर्ता एक स्थापित करता है, तब तक जब तक संशोधित संस्करण इंटरफ़ेस-वर्क के साथ संगत नहीं है के साथ बनाया गया था। " एक .NET DLL असेंबली उन मानदंडों को पूरा करती है और आपके स्वयं के स्रोत को र
जोड़ा लेखक MarkJ, स्रोत
तथ्य यह है कि इस की वैधता इतनी जटिल है कि इस चर्चा के कारण संभवतः बहुत से लोगों के लिए इसका नियम बनता है। यह निश्चित रूप से दिखाता है कि स्थिति अनिश्चित है। अधिकांश लोगों के पास स्थिति की पुष्टि करने के लिए "लीगल टीम" पाने के लिए समय या पैसा नहीं होता है। उस ने कहा, जब तक कि आप लोगों के 1000s में एक पैकेज किए गए समाधान जहाज जहाज में मुक्ति शामिल नहीं कर लेते हैं, यह संभावना है कि कोई भी लाइसेंस को किसी भी तरह लागू नहीं करेगा।
जोड़ा लेखक Martin Brown, स्रोत
फाइलहेल्पर होमपेज कहता है: "फाइलहेल्पर लाइब्रेरी @ कॉपीराइट 2005-2006 मार्कोस मेली के लिए है, लेकिन यह स्रोत कोड है और द्विआधारी वाणिज्यिक और गैर वाणिज्यिक उपयोग के लिए स्वतंत्र हैं।"
जोड़ा लेखक Carl Hörberg, स्रोत

ऐसा करने का एक अच्छा आसान तरीका फ़ाइल खोलना है, और प्रत्येक पंक्ति को सरणी, लिंक्ड सूची, डेटा-स्ट्रक्चर-ऑफ-पसंद में पढ़ना है। यद्यपि पहली पंक्ति को संभालने के बारे में सावधान रहें।

यह आपके सिर पर हो सकता है, लेकिन कनेक्शन स्ट्रिंग

सी # या वीबी के बजाय पायथन का उपयोग क्यों न करें? आयात करने के लिए इसमें एक अच्छा सीएसवी मॉड्यूल है जो आपके लिए भारी भारोत्तोलन करता है।

0
जोड़ा
एक सीएसवी पार्सर के लिए वीबी से पायथन पर कूद न करें। वीबी में एक है। हालांकि अजीब बात यह है कि इस सवाल के जवाब में अनदेखा किया गया है। msdn.microsoft.com/en-us/library/ & hellip;
जोड़ा लेखक MarkJ, स्रोत

मैं @ NotMyself से सहमत हूं। FileHelpers अच्छी तरह से परीक्षण किया जाता है और सभी प्रकार के किनारे के मामलों को संभालता है जो आपको अंततः सौदा करना होगा यदि आप करते हैं तुम्हरे द्वारा। फाइलहेल्पर क्या करता है और केवल अपना खुद का लिख ​​लें, अगर आप पूरी तरह से सुनिश्चित हैं कि (1) आपको किनारे के मामलों को संभालने की आवश्यकता नहीं होगी फाइलहेल्पर करता है, या (2) आप इस तरह की चीजें लिखना पसंद करते हैं और जा रहे हैं जब आपको इस तरह की चीजें पार्स करना पड़ता है तो बहुत खुश रहें:

1, "बिल", "स्मिथ", "पर्यवेक्षक", "कोई टिप्पणी नहीं"

2, 'ड्रेक,', 'ओ'मालली', "जानीटर,

ओह, मुझे उद्धृत नहीं किया गया है और मैं एक नई लाइन पर हूं!

0
जोड़ा

मैं ऊब गया था इसलिए मैंने लिखा कुछ सामान संशोधित किया। यह फ़ाइल के माध्यम से पुनरावृत्ति की मात्रा पर कटौती करने के लिए एक ओओ तरीके से पार्सिंग को समाहित करने का प्रयास करता है, यह केवल शीर्ष foreach पर एक बार फिर से शुरू होता है।

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.IO;

namespace ConsoleApplication1
{
    class Program
    {

        static void Main(string[] args)
        {

            // usage:

            // note this wont run as getting streams is not Implemented

            // but will get you started

            CSVFileParser fileParser = new CSVFileParser();

            // TO Do:  configure fileparser

            PersonParser personParser = new PersonParser(fileParser);

            List persons = new List();
            // if the file is large and there is a good way to limit
            // without having to reparse the whole file you can use a 
            // linq query if you desire
            foreach (Person person in personParser.GetPersons())
            {
                persons.Add(person);
            }

            // now we have a list of Person objects
        }
    }

    public abstract  class CSVParser 
    {

        protected String[] deliniators = { "," };

        protected internal IEnumerable GetRecords()
        {

            Stream stream = GetStream();
            StreamReader reader = new StreamReader(stream);

            String[] aRecord;
            while (!reader.EndOfStream)
            {
                  aRecord = reader.ReadLine().Split(deliniators,
                   StringSplitOptions.None);

                yield return aRecord;
            }

        }

        protected abstract Stream GetStream(); 

    }

    public class CSVFileParser : CSVParser
    {
        // to do: add logic to get a stream from a file

        protected override Stream GetStream()
        {
            throw new NotImplementedException();
        } 
    }

    public class CSVWebParser : CSVParser
    {
        // to do: add logic to get a stream from a web request

        protected override Stream GetStream()
        {
            throw new NotImplementedException();
        }
    }

    public class Person
    {
        public String Name { get; set; }
        public String Address { get; set; }
        public DateTime DOB { get; set; }
    }

    public class PersonParser 
    {

        public PersonParser(CSVParser parser)
        {
            this.Parser = parser;
        }

        public CSVParser Parser { get; set; }

        public  IEnumerable GetPersons()
        {
            foreach (String[] record in this.Parser.GetRecords())
            {
                yield return new Person()
                {
                    Name = record[0],
                    Address = record[1],
                    DOB = DateTime.Parse(record[2]),
                };
            }
        }
    }
}
0
जोड़ा

ओलेडीबी कनेक्शन का प्रयोग करें।

String sConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\InputDirectory\\;Extended Properties='text;HDR=Yes;FMT=Delimited'";
OleDbConnection objConn = new OleDbConnection(sConnectionString);
objConn.Open();
DataTable dt = new DataTable();
OleDbCommand objCmdSelect = new OleDbCommand("SELECT * FROM file.csv", objConn);
OleDbDataAdapter objAdapter1 = new OleDbDataAdapter();
objAdapter1.SelectCommand = objCmdSelect;
objAdapter1.Fill(dt);
objConn.Close();
0
जोड़ा
इसके लिए फाइल सिस्टम एक्सेस की आवश्यकता है। जहां तक ​​मुझे पता है कि ओएलडीडीबी इन-मेमोरी धाराओं के साथ काम करने का कोई तरीका नहीं है :(
जोड़ा लेखक UserControl, स्रोत
मैं शिकायत नहीं कर रहा हूँ। असल में मैं बाकी हिस्सों पर ओएलडीडीबी समाधान पसंद करूंगा लेकिन एएसपी.NET अनुप्रयोगों में सीएसवी को पार्स करने के लिए आवश्यक कई बार निराश था, इसलिए इसे नोट करना चाहता था।
जोड़ा लेखक UserControl, स्रोत
@UserControl, ज़ाहिर है कि इसे फाइल सिस्टम एक्सेस की आवश्यकता है। उन्होंने एक सीएसवी फ़ाइल आयात करने के बारे में पूछा
जोड़ा लेखक Kevin, स्रोत

माइक्रोसॉफ्ट के TextFieldParser स्थिर है और निम्न आरएफसी 4180 सीएसवी फाइलों के लिए। Microsoft.VisualBasic नामस्थान द्वारा बंद न करें; यह .NET Framework में एक मानक घटक है, बस वैश्विक Microsoft.VisualBasic असेंबली का संदर्भ जोड़ें।

यदि आप विंडोज के लिए संकलित कर रहे हैं (मोनो के विपरीत) और "टूटी हुई" (गैर-आरएफसी-अनुरूप) सीएसवी फाइलों को पार्स करने की उम्मीद न करें, तो यह स्पष्ट विकल्प होगा, क्योंकि यह मुफ़्त, अप्रतिबंधित, स्थिर है, और सक्रिय रूप से समर्थित है, जिनमें से अधिकांश FileHelpers के लिए नहीं कहा जा सकता है।

यह भी देखें: कैसे करें: विजुअल बेसिक में अल्पविराम-सीमित टेक्स्ट फ़ाइलों से पढ़ें एक वीबी कोड उदाहरण के लिए।

0
जोड़ा
TextFieldParser टैब-डिलीमिट और अन्य अजीब एक्सेल-जेनरेटेड क्रुफ़्ट के लिए भी काम करेगा। मुझे एहसास है कि आपका पिछला जवाब दावा नहीं कर रहा था कि पुस्तकालय वीबी-विशिष्ट था, यह सिर्फ मेरे पास आया था कि यह वास्तव में मतलब वीबी के लिए था, और इच्छित सी # से उपयोग किया जाना चाहिए, जो मुझे नहीं लगता कि मामला है - एमएसवीबी में कुछ वास्तव में उपयोगी कक्षाएं हैं।
जोड़ा लेखक Aaronaught, स्रोत
वास्तव में दुर्भाग्य से नामित नामस्थान के अलावा इस वर्ग के बारे में वीबी-विशिष्ट कुछ भी नहीं है। मैं निश्चित रूप से इस लाइब्रेरी को चुनता हूं अगर मुझे केवल "सरल" सीएसवी पार्सर की आवश्यकता होती है, क्योंकि सामान्य रूप से डाउनलोड करने, वितरित करने या चिंता करने के लिए कुछ भी नहीं है। इसके अंत में मैंने इस उत्तर से वीबी केंद्रित फोकस संपादित किया है।
जोड़ा लेखक Aaronaught, स्रोत
@ अरोशॉट मुझे लगता है कि आपके संपादन ज्यादातर सुधार हैं। हालांकि आरएफसी अनिवार्य रूप से आधिकारिक नहीं है, क्योंकि कई सीएसवी लेखकों का पालन नहीं करते हैं उदा। एक्सेल हमेशा अल्पविराम का उपयोग नहीं करता है । मेरे पिछले जवाब में पहले से ही यह नहीं कहा गया था कि कक्षा सी # से उपयोग की जा सकती है?
जोड़ा लेखक MarkJ, स्रोत

मुझे इस गर्मी में एक परियोजना के लिए .NET में एक CSV पार्सर का उपयोग करना पड़ा और माइक्रोसॉफ़्ट जेट टेक्स्ट ड्राइवर पर बस गया। आप एक कनेक्शन स्ट्रिंग का उपयोग कर एक फ़ोल्डर निर्दिष्ट करते हैं, फिर SQL चयन कथन का उपयोग कर फ़ाइल पूछें। आप schema.ini फ़ाइल का उपयोग करके मजबूत प्रकार निर्दिष्ट कर सकते हैं। मैंने पहले ऐसा नहीं किया था, लेकिन फिर मुझे खराब परिणाम मिल रहे थे, जहां डेटा का प्रकार तुरंत स्पष्ट नहीं था, जैसे कि आईपी नंबर या "XYQ 3.9 SP1" जैसी प्रविष्टि।

एक सीमा में मैंने भाग लिया कि यह 64 वर्णों के ऊपर कॉलम नामों को संभाल नहीं सकता है; यह truncates। यह एक समस्या नहीं होनी चाहिए, सिवाय इसके कि मैं बहुत खराब डिजाइन किए गए इनपुट डेटा से निपट रहा था। यह एक एडीओ.NET डेटासेट देता है।

यह मुझे मिला सबसे अच्छा समाधान था। मैं अपने स्वयं के सीएसवी पार्सर को घुमाने से सावधान रहूंगा, क्योंकि शायद मुझे कुछ अंत मामलों में याद आती है, और मुझे वहां .NET के लिए कोई अन्य मुफ्त सीएसवी पार्सिंग पैकेज नहीं मिला।

संपादित करें: इसके अलावा, प्रति निर्देशिका केवल एक schema.ini फ़ाइल हो सकती है, इसलिए मैंने आवश्यक कॉलम को दृढ़ता से टाइप करने के लिए गतिशील रूप से इसमें शामिल किया। यह केवल निर्दिष्ट कॉलम को दृढ़ता से टाइप करेगा, और किसी अनिर्दिष्ट फ़ील्ड के लिए अनुमान लगाएगा। मैंने वास्तव में इसकी सराहना की, क्योंकि मैं तरल पदार्थ 70+ कॉलम सीएसवी आयात करने से निपट रहा था और प्रत्येक कॉलम को निर्दिष्ट नहीं करना चाहता था, केवल गलत व्यवहार करने वाले।

0
जोड़ा
सीएसवी पार्सर में निर्मित वीबी.नेट क्यों नहीं? msdn.microsoft.com/en-us/library/ & hellip;
जोड़ा लेखक MarkJ, स्रोत

मैंने कुछ कोड में टाइप किया। डेटाग्रिडव्यूवर में नतीजा अच्छा लगा। यह वस्तुओं की एक सरणी सूची में टेक्स्ट की एक पंक्ति को पार करता है।

    enum quotestatus
    {
        none,
        firstquote,
        secondquote
    }
    public static System.Collections.ArrayList Parse(string line,string delimiter)
    {        
        System.Collections.ArrayList ar = new System.Collections.ArrayList();
        StringBuilder field = new StringBuilder();
        quotestatus status = quotestatus.none;
        foreach (char ch in line.ToCharArray())
        {                                
            string chOmsch = "char";
            if (ch == Convert.ToChar(delimiter))
            {
                if (status== quotestatus.firstquote)
                {
                    chOmsch = "char";
                }                         
                else
                {
                    chOmsch = "delimiter";                    
                }                    
            }

            if (ch == Convert.ToChar(34))
            {
                chOmsch = "quotes";           
                if (status == quotestatus.firstquote)
                {
                    status = quotestatus.secondquote;
                }
                if (status == quotestatus.none )
                {
                    status = quotestatus.firstquote;
                }
            }

            switch (chOmsch)
            {
                case "char":
                    field.Append(ch);
                    break;
                case "delimiter":                        
                    ar.Add(field.ToString());
                    field.Clear();
                    break;
                case "quotes":
                    if (status==quotestatus.firstquote)
                    {
                        field.Clear();                            
                    }
                    if (status== quotestatus.secondquote)
                    {                                                                           
                            status =quotestatus.none;                                
                    }                    
                    break;
            }
        }
        if (field.Length != 0)            
        {
            ar.Add(field.ToString());                
        }           
        return ar;
    }
0
जोड़ा