Συμβουλές

Τρόπος ανάλυσης μιας αλφαριθμητικής συμβολοσειράς σε μια λίστα συμβολοσειρών

Τρόπος ανάλυσης μιας αλφαριθμητικής συμβολοσειράς σε μια λίστα συμβολοσειρών



We are searching data for your request:

Forums and discussions:
Manuals and reference books:
Data from registers:
Wait the end of the search in all databases.
Upon completion, a link will appear to access the found materials.

Υπάρχουν πολλές φορές όταν πρέπει να διαιρέσετε μια συμβολοσειρά σε μια σειρά από χορδές χρησιμοποιώντας ένα χαρακτήρα ως διαχωριστικό. Για παράδειγμα, ένα αρχείο CSV (διαχωρισμένο με κόμμα) μπορεί να έχει μια γραμμή όπως "Zarko; Gajic ;; DelphiGuide" και θέλετε αυτή η γραμμή να αναλυθεί σε 4 γραμμές ("strick", "Gajic", " κενή συμβολοσειρά) και "DelphiGuide" χρησιμοποιώντας τον χαρακτήρα "τελεία" ως οριοθέτης.

Ο Δελφός παρέχει αρκετές μεθόδους για την ανάλυση μιας συμβολοσειράς, αλλά μπορεί να διαπιστώσετε ότι κανείς δεν κάνει ακριβώς αυτό που χρειάζεστε. Για παράδειγμα, η μέθοδος ExtractStrings RTL χρησιμοποιεί πάντα χαρακτήρες προσφοράς (μονή ή διπλή) για τους οριοθέτες. Μια άλλη προσέγγιση είναι να χρησιμοποιήσετε τοΔιαχωριστής καιDelimitedText ιδιότητες της κλάσης TStrings - αλλά δυστυχώς, υπάρχει ένα σφάλμα στην υλοποίηση ("μέσα" στους Δελφούς) όπου ο χαρακτήρας διαστήματος χρησιμοποιείται πάντα ως οριοθέτης.

Η μόνη λύση για την ανάλυση μιας οριοθετημένης συμβολοσειράς είναι να γράψετε μια δική σας μέθοδο:

Παράδειγμα συμβολοσειράς

~~~~~~~~~~~~~~~~~~~~~~~~~
διαδικασία ParseDelimited (const sl: TStrings · τιμή const: string · const οριοθέτης: συμβολοσειρά);
var
dx: ακέραιο;
ns: string;
txt: string;
delta: ακέραιο;
αρχίσει
delta: = Μήκος (οριοθέτης).
txt: = αξία + οριοθέτης;
sl.BeginUpdate;
sl.Clear;
προσπαθήστε
ενώ το μήκος (txt)> 0 κάνει
αρχίσει
dx: = Pos (οριοθέτης, txt);
ns: = Αντιγραφή (txt, 0, dx-1).
sl.Add (ns);
txt: = Αντιγραφή (txt, dx + δέλτα, MaxInt);
τέλος;
τελικά
sl.EndUpdate;
τέλος;
τέλος;
~~~~~~~~~~~~~~~~~~~~~~~~~

Χρήση (συμπληρώνει Memo1):
ParseDelimited (Memo1.lines, 'Zarko' Gajic '; DelphiGuide', ';')