de173 Δημοσ. 8 Αυγούστου 2012 Δημοσ. 8 Αυγούστου 2012 Καλησπέρα! Προσπαθώ εδώ και καιρό να κατασκευάσω ένα πρόγραμμα το οποίο θα αντιγράφει τα περιεχόμενα ενός text αρχείου σε ένα richtextbox και στη συνέχεια αυτά τα δεδομένα θα γράφονται σε άλλο αρχείο text. Η διαδικασία ανοίγματος αρχείου, φορτώματος στο rtb και μετά σώσιμο των δεδομένων σε άλλο αρχείο βαίνει καλώς εκτός... της κωδικοποίησης! Το πρώτο αρχείο είναι κωδικοποίησης utf-8. Το περιεχόμενο στο rtb φαίνεται με "κινέζικους" χαρακτήρες και στο σώσιμο, το δεύτερο text αρχείο περιέχει unicode χαρακτήρες. Είναι δυνατόν να φορτώσουμε στο rtb τα δεδομένα ως UTF-8 και μετά κατά το σώσιμο, η κωδικοποίηση του δεύτερου αρχείου να παραμένει ως utf-8; Το φόρτωμα στο rtb το κάνω με αυτόν τον τρόπο: RichTextBox1.LoadFile(OpenFileDialog1.FileName, RichTextBoxStreamType.PlainText) ενώ το φόρτωμα στο δεύτερο αρχείο από το rtb το κάνω έτσι: Dim strwrite As New StreamWriter(SaveFileDialog1.FileName) For Each line As String In RichTextBox1.Lines If Not line.StartsWith("T") Then strwrite.WriteLine(Trim(line)) End If Next strwrite.Close() Καμία ιδέα; Ευχαριστώ εκ των προτέρων!! Υπάρχει περίπτωση να αποφύγουμε τη χρήση του rtb; Το χρησιμοποίησα γιατί δεν ήξερα πώς να κάνω την αντιγραφή από αρχείο σε αρχείο χωρίς να αντιγράφω τη γραμμή που ξεκινά από "T" (όπως φαίνεται στο "If not line.StartsWith("T") Then.....")
moukoublen Δημοσ. 8 Αυγούστου 2012 Δημοσ. 8 Αυγούστου 2012 > Dim lines As String() lines = System.IO.File.ReadAllLines(OpenFileDialog1.FileName, System.Text.Encoding.UTF8) Dim newFileLines As New List(Of String) For Each ln As String In lines If Not ln.StartsWith("T") Then newFileLines.Add(ln) End If Next System.IO.File.WriteAllLines(SaveFileDialog1.FileName, newFileLines, System.Text.Encoding.UTF8) EDIT: Και δεν χρειάζεσαι ούτε StreamWriter και γράψιμο με το χέρι ούτε, ακόμα περισσότερο, το control RichTextBox σαν μεσολαβιτή.
de173 Δημοσ. 8 Αυγούστου 2012 Μέλος Δημοσ. 8 Αυγούστου 2012 Σε ευχαριστώ πάρα πολύ! It worked!!! Πώς μπορεί να γίνει κάθε γραμμή όμως trim; όπως εδώ: strwrite.WriteLine(Trim(line))
moukoublen Δημοσ. 8 Αυγούστου 2012 Δημοσ. 8 Αυγούστου 2012 Αντίστοιχα στο σημείο που αποφασίζεις ότι θα κρατήσεις τη γραμμή και τη βάζεις στην προσωρινή λίστα, πριν την βάλεις την trim-αρεις. newFileLines.Add(Trim(ln))
de173 Δημοσ. 9 Αυγούστου 2012 Μέλος Δημοσ. 9 Αυγούστου 2012 Δυστυχώς το trim δε λειτούργησε.. Καμία ιδέα Ευχαριστώ εκ των προτέρων!
nspyrou Δημοσ. 9 Αυγούστου 2012 Δημοσ. 9 Αυγούστου 2012 Αντίστοιχα στο σημείο που αποφασίζεις ότι θα κρατήσεις τη γραμμή και τη βάζεις στην προσωρινή λίστα, πριν την βάλεις την trim-αρεις. newFileLines.Add(Trim(ln)) δοκίμασε: newFileLines.Add(ln.Trim())
de173 Δημοσ. 9 Αυγούστου 2012 Μέλος Δημοσ. 9 Αυγούστου 2012 Δυτυχώς μου δίνει και πάλι όλη την εγγραφή με τα κενά στο τέλος. Ίσως αν περιόριζα την ανάγνωση κάθε εγγραφής μέχρι τον 521ο χαρακτήρα; Δηλαδή να διαβάζει από το 1ο μέχρι το 512ο χαρακτήρα σε κάθε γραμμή. Προσπάθησα να κάνω το εξής: ln = Strings.Trim(ln) Αλλά παρατήρησα ότι ΔΕΝ έκανε trim όπως θα έπρεπε (τα κενά ακόμα βρίσκονταν στο τέλος κάθε εγγραφής) Οπότε το έκανα ως εξής: ln = Strings.Left(ln, 521) Και δούλεψε κανονικά. Ωστόσο είναι αξιοπερίεργο για ποιο λόγο δε δούλεψε η Trim.
de173 Δημοσ. 9 Αυγούστου 2012 Μέλος Δημοσ. 9 Αυγούστου 2012 Και τώρα το δύσκολο σημείο.... Το τελικό αρχείο στο οποίο έκανα αντιγραφή όλες τις εγγραφές από το πρώτο είναι UTF-8. Προσπαθώντας να το βάλω στον SQL server (είτε δημιουργώντας πακέτο dtsx είτε με bulk insert), το αρχείο δεν διαβαζόταν σωστά. Στη πρώτη περίπτωση εμφανίζονται τελείες ενδιαμέσως των ελληνικών γραμμάτων ενώ στη δεύτερη υπάρχει bug στον SQL και δε μπορεί να διαβάσει εγγραφές κωδικοποίησης 65001. Έχει κανείς καμία ιδέα πως μπορεί να λυθεί;
moukoublen Δημοσ. 9 Αυγούστου 2012 Δημοσ. 9 Αυγούστου 2012 δοκίμασε: newFileLines.Add(ln.Trim()) Σωστά. Απλά η VB.ΝΕΤ έχει διατηρήσει (για τους ερχόμενους απο VB6) τις global συναρτήσεις που είχε. Βασικά έχει προσπαθήσει να διατηρήσει πλήρως την VB6 λογική - σύνταξη - νοοτροπία και ταυτόχρονα να "χωρέσει" και το σύγχρονο και πιο "σοβαρό" προγραμματισμό του .ΝΕΤ και το αποτέλεσμα ώρες-ώρες σπάει κόκαλα όπως πχ: Dim newFileLines As New List(Of String)() ^1 ^2 ^3 1: Δηλώνεις οτι γίνεται άμεσα και construct. Ok... 2: Template, Πάλι με παρενθέσεις και θέλει και το Of... 3: Τα ορίσματα του constructor... Αν όμως δεν έβαζες το New τότε η τελευταία παρένθεση θα ήταν... πίνακας... anyway... Και τώρα το δύσκολο σημείο.... Το τελικό αρχείο στο οποίο έκανα αντιγραφή όλες τις εγγραφές από το πρώτο είναι UTF-8. Προσπαθώντας να το βάλω στον SQL server (είτε δημιουργώντας πακέτο dtsx είτε με bulk insert), το αρχείο δεν διαβαζόταν σωστά. Στη πρώτη περίπτωση εμφανίζονται τελείες ενδιαμέσως των ελληνικών γραμμάτων ενώ στη δεύτερη υπάρχει bug στον SQL και δε μπορεί να διαβάσει εγγραφές κωδικοποίησης 65001. Έχει κανείς καμία ιδέα πως μπορεί να λυθεί; Η βάση σου τη collation έχει;
de173 Δημοσ. 9 Αυγούστου 2012 Μέλος Δημοσ. 9 Αυγούστου 2012 Η βάση σου τη collation έχει; GREEK_CI_AS Δεν ξέρω αν παίζει ρόλο αυτό.. Να προτείνω κάτι άλλο... Μπορούμε να κάνουμε mid στο ln και να το κάνουμε insert σε SQL πίνακα;
moukoublen Δημοσ. 9 Αυγούστου 2012 Δημοσ. 9 Αυγούστου 2012 Δοκίμασε το τελικό αρχείο να το σώσεις σε windows-1253. Δηλαδή όταν το κάνεις write στην VB κάνε το εξής: > System.IO.File.WriteAllLines(SaveFileDialog1.FileName, newFileLines, System.Text.Encoding.GetEncoding("Windows-1253"))
de173 Δημοσ. 9 Αυγούστου 2012 Μέλος Δημοσ. 9 Αυγούστου 2012 Δυστυχώς το αποθηκεύει με σύμβολα (σταυρούς και κουτάκια)
moukoublen Δημοσ. 9 Αυγούστου 2012 Δημοσ. 9 Αυγούστου 2012 Δυστυχώς το αποθηκεύει με σύμβολα (σταυρούς και κουτάκια) Δεν μπορώ να καταλάβω γιατί. Βεβαιώσου ότι στην εντολή έγραψες GetEncoding("Windows-1253"). Μπορείς να τα κάνεις insert μέσα από τη VB την ώρα που τα διαβάζεις. Αλλά ας αποκλείσεις πρώτα τα παραπάνω.
de173 Δημοσ. 9 Αυγούστου 2012 Μέλος Δημοσ. 9 Αυγούστου 2012 Έσβησα το αρχείο και δούλεψε! Από τα ανήκουστα.. Όντως το αποθηκεύει ως ANSI... Θα ήταν ωραίο όμως να το κάναμε και κατευθείαν insert.. Πάω να μελετήσω το τρόπο και θα επιστρέψω!
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα