सलाह

कैसे एक स्ट्रिंग सूची में एक सीमांकित स्ट्रिंग पार्स करने के लिए

कैसे एक स्ट्रिंग सूची में एक सीमांकित स्ट्रिंग पार्स करने के लिए

कई बार जब आपको एक स्ट्रिंग को एक विभाजक के रूप में एक पात्र का उपयोग करके स्ट्रिंग के एक सरणी में विभाजित करने की आवश्यकता होती है। उदाहरण के लिए, एक CSV ("अल्पविराम" अलग) फ़ाइल में "Zarko; Gajic ;; DelphiGuide" जैसी रेखा हो सकती है और आप चाहते हैं कि यह रेखा 4 लाइनों (तार) "Zarko," Gajic "," "(" खाली स्ट्रिंग) और "डेल्फीगाइड" अर्ध-बृहदान्त्र वर्ण का उपयोग करके ";" एक परिसीमनकर्ता के रूप में।

डेल्फी एक स्ट्रिंग को पार्स करने के लिए कई तरीके प्रदान करता है, लेकिन आप पा सकते हैं कि न तो किसी को वास्तव में आपकी आवश्यकता है। उदाहरण के लिए, एक्स्ट्रेम्स स्प्रिंग्स RTL विधि हमेशा सीम पात्रों (एकल या डबल) का उपयोग करता है। एक अन्य दृष्टिकोण का उपयोग करना हैसीमान्तक औरDelimitedText TStrings वर्ग के गुण-लेकिन दुर्भाग्य से, कार्यान्वयन में एक बग है ("अंदर" डेल्फी) जहां अंतरिक्ष चरित्र हमेशा एक सीमांकक के रूप में उपयोग किया जाता है।

एक सीमांकित स्ट्रिंग को पार्स करने का एकमात्र समाधान अपनी खुद की एक विधि लिखना है:

सीमांकित स्ट्रिंग उदाहरण

~~~~~~~~~~~~~~~~~~~~~~~~~
प्रक्रिया ParseDelimited (कॉन्स्टेबल स्ल: टस्ट्रेस; कास्ट वैल्यू: स्ट्रिंग; कॉन्स्ट डिमाइटर: स्ट्रिंग);
वर
dx: पूर्णांक;
ns: स्ट्रिंग;
txt: स्ट्रिंग;
डेल्टा: पूर्णांक;
शुरू
डेल्टा: = लंबाई (सीमांकक);
txt: = value + delimiter;
sl.BeginUpdate;
sl.Clear;
प्रयत्न
जबकि लंबाई (txt)> 0 करते हैं
शुरू
dx: = Pos (सीमांकक, txt);
ns: = कॉपी (txt, 0, dx-1);
sl.Add (ns);
txt: = copy (txt, dx + delta, MaxInt);
समाप्त;
आखिरकार
sl.EndUpdate;
समाप्त;
समाप्त;
~~~~~~~~~~~~~~~~~~~~~~~~~

उपयोग (मेमो 1 में भरता है):
ParseDelimited (Memo1.lines, 'Zarko; Gajic ;; DelphiGuide', ';')