सीमित स्ट्रिंग पार्सिंग?

मैं एक सीमित स्ट्रिंग पार्सिंग के क्रम में कुछ देख रहा हूं

एक, ख, ग

लेकिन यह एक बहुत ही सरल उदाहरण है, और सीमित डेटा पार्सिंग जटिल हो सकता है; उदाहरण के लिए

1, "आपका सरल एल्गोरिदम, यह विफल रहता है", सच है

आपके नाइव स्ट्रिंग को उड़ाएगा। बिट्स को कार्यान्वित करें। क्या कोई ऐसी चीज है जिसे मैं स्वतंत्र रूप से उपयोग/चोरी/कॉपी और पेस्ट कर सकता हूं जो सीमित पाठ को पार्स करने के लिए अपेक्षाकृत बुलेटप्रूफ समाधान प्रदान करता है? .NET, प्लॉक्स।

Update: I decided to go with the TextFieldParser, which is part of VB.NET's pile of goodies hidden away in Microsoft.VisualBasic.DLL.

0
ro fr bn

9 उत्तर

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

0
जोड़ा

मुझे किसी भी ढांचे के बारे में पता नहीं है, लेकिन एक साधारण राज्य मशीन काम करती है:

  • State 1: Read every char until you hit a " or a ,
    • In case of a ": Move to State 2
    • In case of a ,: Move to State 3
    • In case of the end of file: Move to state 4
  • State 2: Read every char until you hit a "
    • In case of a ": Move to State 1
    • In case of the end of the file: Either Move to State 4 or signal an error because of an unterminated string
  • State 3: Add the current buffer to the output array, move the cursor forward behind the , and back to State 1.
  • State 4: this is the final state, does nothing except returning the output array.
0
जोड़ा
यह वास्तव में सच है, मैं हमेशा डरावने \ n चरित्र के बारे में भूल जाता हूं जो अधिकांश सीएसवी पार्सर्स को खराब करता है। स्पष्ट किया।
जोड़ा लेखक Michael Stum, स्रोत
सीएसवी स्ट्रिंग्स में टेक्स्ट कोट्स के भीतर नए लाइन वर्ण शामिल हो सकते हैं, इसलिए यदि आप लाइन के अंत में राज्य 2 में त्रुटि को सिग्नल नहीं कर सकते हैं।
जोड़ा लेखक cjk, स्रोत

There are some good answers here: Split a string ignoring quoted sections

हो सकता है कि आप अपने प्रश्न को कुछ और सटीक (उदाहरण के लिए क्या कोड स्निपेट या लाइब्रेरी का उपयोग कर सकते हैं जो .NET में CSV डेटा को पार्स करने के लिए उपयोग कर सकते हैं?)।

0
जोड़ा

मैं सोच रहा हूं कि एक सामान्य ढांचे को दो चीजों के बीच निर्दिष्ट करने की आवश्यकता होगी: 1. सीमित पात्र क्या हैं। 2. उन स्थितियों के तहत उन पात्रों की गणना नहीं होती है (जैसे कि जब वे उद्धरण के बीच होते हैं)।

मुझे लगता है कि जब भी आपको ऐसा कुछ करने की ज़रूरत होती है, तो यह कस्टम तर्क लिखने से बेहतर हो सकता है।

0
जोड़ा

सरल तरीका स्ट्रिंग को चार सरणी में विभाजित करना है और अपने स्ट्रिंग निर्धारक और विभाजित चार को ढूंढना है।

यह इकाई परीक्षण के लिए अपेक्षाकृत आसान होना चाहिए।

आप इसे बुनियादी के समान एक्सटेंशन विधि में लपेट सकते हैं। स्प्लिट विधि।

0
जोड़ा
एक स्ट्रिंग स्वाभाविक रूप से एक चार सरणी है, आपको कोई रूपांतरण करने की आवश्यकता नहीं है
जोड़ा लेखक cjk, स्रोत

मैं इसे फ़ाइल से पढ़ने के लिए उपयोग करता हूं

string filename = @textBox1.Text;
string[] fields;
string[] delimiter = new string[] {"|"};
using (Microsoft.VisualBasic.FileIO.TextFieldParser parser =
       new Microsoft.VisualBasic.FileIO.TextFieldParser(filename)) {
    parser.Delimiters = delimiter;
    parser.HasFieldsEnclosedInQuotes = false;

    while (!parser.EndOfData) {
        fields = parser.ReadFields();
        //Do what you need
    }
}

मुझे यकीन है कि यहां कोई व्यक्ति इसे स्मृति में एक स्ट्रिंग को पार्सर में बदलने के लिए बदल सकता है।

0
जोड़ा
इस जवाब पर वापस आ रहा है, मुझे अभी भी लगता है कि यह सबसे अच्छा है। मैंने फाइलहेल्पर की कोशिश की है और इस निष्कर्ष पर पहुंचे हैं कि वे मुझे डराते हैं। मुझे एक ढांचे पर भरोसा नहीं है जो कि इस प्रकार निर्भर करता है कि फ़ील्ड को किसी प्रकार पर परिभाषित किया गया है।
जोड़ा लेखक Will, स्रोत

कभी भी देर से बेहतर नहीं (एसओ की पूर्णता में जोड़ें):

http://www.codeproject.com/KB/database/CsvReader.aspx

यह एक एफएफ-आईएनजी नियम है।

जी जे

0
जोड़ा

जैसे कि

var elements = new List();
var current = new StringBuilder();
var p = 0;

while (p < internalLine.Length) {
    if (internalLine[p] == '"') {
        p++;

        while (internalLine[p] != '"') {
            current.Append(internalLine[p]);
            p++;
        }

       //Skip past last ',
        p += 2;
    }
    else {
        while ((p < internalLine.Length) && (internalLine[p] != ',')) {
            current.Append(internalLine[p]);
            p++;
        }

       //Skip past ,
        p++;
    }

    elements.Add(current.ToString());
    current.Length = 0;
}
0
जोड़ा
@ सी 1 एफआर कृपया जावा बनाम सी #/पास्कल ब्रैकेटिंग जैसे स्टाइलिस्टिस्ट संपादन न करें।
जोड़ा लेखक StuartLC, स्रोत
माना। मैंने इस संपादन को अस्वीकार करने की कोशिश की लेकिन इसे पहले से ही मंजूरी दे दी गई थी।
जोड़ा लेखक Andy West, स्रोत
जिस पर मैं जोड़ना चाहता हूं हम के एंड आर नहीं हैं, न ही लिनक्स कर्नेल विकास में। एफएफएस, दोस्तों।
जोड़ा लेखक Stu, स्रोत

A very complrehesive library can be found here: FileHelpers

0
जोड़ा
मैंने इस प्रश्न पूछने के बाद से फाइलहेल्पर की कोशिश की है और मुझे वास्तव में सीमित पार्सर्स पसंद नहीं हैं।
जोड़ा लेखक Will, स्रोत