नेट में CSV फ़ाइल आयात

वोट
99

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

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

05/08/2008 को 05:43
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


12 जवाब

वोट
72

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

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

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

01/04/2009 को 20:58
का स्रोत उपयोगकर्ता

वोट
48

की जाँच करें FileHelpers मुक्त स्रोत पुस्तकालय

05/08/2008 को 05:47
का स्रोत उपयोगकर्ता

वोट
21

एक OLEDB कनेक्शन का उपयोग करें।

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();
05/11/2008 को 15:41
का स्रोत उपयोगकर्ता

वोट
12

आप CSV पार्सिंग के लिए काफी जटिल परिस्थितियां की उम्मीद कर रहे हैं, तो भी हमारे अपने पार्सर रोलिंग से नहीं लगता कि । वहाँ वहाँ बाहर, जैसे उत्कृष्ट उपकरणों की एक बहुत हैं FileHelpers , या यहाँ तक से लोगों CodeProject

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

17/08/2008 को 00:44
का स्रोत उपयोगकर्ता

वोट
9

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

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

2, 'ड्रेक,', 'ओ' मैली ', "चौकीदार

ओह, मैं उद्धृत नहीं कर रहा हूँ और मैं एक नई लाइन पर हूँ!

17/08/2008 को 00:53
का स्रोत उपयोगकर्ता

वोट
9

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

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

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

    StringReader stringReader = new StringReader(content);

    bool inQoutedString = false;
    IList<string> record = new List<string>();
    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<string>();

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

ध्यान दें कि यह दोहरे उद्धरण चिह्नों द्वारा deliminated नहीं किया जा रहा क्षेत्रों के किनारे मामले को संभाल नहीं है, लेकिन इसके अंदर एक उद्धृत स्ट्रिंग होने meerley। देखें इस पोस्ट के लिए एक बेहतर expanation का एक सा के लिए और साथ ही कुछ उचित पुस्तकालयों के लिए कुछ लिंक।

08/08/2008 को 17:20
का स्रोत उपयोगकर्ता

वोट
6

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

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<Person> persons = new List<Person>();
            // 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<String[]> 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<Person> GetPersons()
        {
            foreach (String[] record in this.Parser.GetRecords())
            {
                yield return new Person()
                {
                    Name = record[0],
                    Address = record[1],
                    DOB = DateTime.Parse(record[2]),
                };
            }
        }
    }
}
08/08/2008 को 10:39
का स्रोत उपयोगकर्ता

वोट
5

वहाँ है कि एक समाधान है, एक का उपयोग करता है के लिए कोड प्रदान CodeProject पर दो लेख हैं StreamReader और एक कि सीएसवी डेटा आयात का उपयोग कर माइक्रोसॉफ्ट पाठ ड्राइवर

05/08/2008 को 06:24
का स्रोत उपयोगकर्ता

वोट
2

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

यह अपने सिर पर हो सकता है, लेकिन वहाँ के रूप में अच्छी तरह से एक का उपयोग कर उन तक पहुँचने के लिए एक सीधा रास्ता हो रहा है कनेक्शन स्ट्रिंग

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

05/08/2008 को 05:49
का स्रोत उपयोगकर्ता

वोट
1

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

    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;
    }
09/09/2011 को 11:02
का स्रोत उपयोगकर्ता

वोट
1

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

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

यह सबसे अच्छा समाधान मैंने पाया था। मैं अपने सीएसवी पार्सर रोलिंग से सावधान रहना होगा क्योंकि मैं शायद अंत मामलों में से कुछ अनदेखा कर देते हैं, और मैं वहाँ नेट के लिए किसी भी अन्य मुक्त सीएसवी पार्स संकुल नहीं मिला।

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

16/08/2008 को 23:15
का स्रोत उपयोगकर्ता

वोट
0

आप गारंटी ले सकते हैं, तो डेटा में कोई अल्पविराम के देखते हैं कि, तो सबसे आसान तरीका शायद उपयोग करने के लिए किया जाएगा String.split

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

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

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

05/08/2008 को 06:02
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more