Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπέρα!

 

Προσπαθώ εδώ και καιρό να κατασκευάσω ένα πρόγραμμα το οποίο θα αντιγράφει τα περιεχόμενα ενός 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.....")

Δημοσ.

>
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 σαν μεσολαβιτή.

Δημοσ.

Σε ευχαριστώ πάρα πολύ!

It worked!!! :-D

 

Πώς μπορεί να γίνει κάθε γραμμή όμως trim;

 

όπως εδώ: strwrite.WriteLine(Trim(line))

Δημοσ.

Αντίστοιχα στο σημείο που αποφασίζεις ότι θα κρατήσεις τη γραμμή και τη βάζεις στην προσωρινή λίστα, πριν την βάλεις την trim-αρεις.

 

 

newFileLines.Add(Trim(ln))

Δημοσ.

Αντίστοιχα στο σημείο που αποφασίζεις ότι θα κρατήσεις τη γραμμή και τη βάζεις στην προσωρινή λίστα, πριν την βάλεις την trim-αρεις.

 

 

newFileLines.Add(Trim(ln))

 

δοκίμασε:

 

newFileLines.Add(ln.Trim())

Δημοσ.

Δυτυχώς μου δίνει και πάλι όλη την εγγραφή με τα κενά στο τέλος.

Ίσως αν περιόριζα την ανάγνωση κάθε εγγραφής μέχρι τον 521ο χαρακτήρα; Δηλαδή να διαβάζει από το 1ο μέχρι το 512ο χαρακτήρα σε κάθε γραμμή.

 

Προσπάθησα να κάνω το εξής:

 

ln = Strings.Trim(ln)

 

Αλλά παρατήρησα ότι ΔΕΝ έκανε trim όπως θα έπρεπε (τα κενά ακόμα βρίσκονταν στο τέλος κάθε εγγραφής)

 

Οπότε το έκανα ως εξής:

 

ln = Strings.Left(ln, 521)

 

Και δούλεψε κανονικά. Ωστόσο είναι αξιοπερίεργο για ποιο λόγο δε δούλεψε η Trim.

Δημοσ.

Και τώρα το δύσκολο σημείο....

Το τελικό αρχείο στο οποίο έκανα αντιγραφή όλες τις εγγραφές από το πρώτο είναι UTF-8.

 

Προσπαθώντας να το βάλω στον SQL server (είτε δημιουργώντας πακέτο dtsx είτε με bulk insert), το αρχείο δεν διαβαζόταν σωστά. Στη πρώτη περίπτωση εμφανίζονται τελείες ενδιαμέσως των ελληνικών γραμμάτων ενώ στη δεύτερη υπάρχει bug στον SQL και δε μπορεί να διαβάσει εγγραφές κωδικοποίησης 65001.

 

Έχει κανείς καμία ιδέα πως μπορεί να λυθεί;

Δημοσ.

δοκίμασε:

 

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 έχει;

Δημοσ.

Η βάση σου τη collation έχει;

 

GREEK_CI_AS

 

Δεν ξέρω αν παίζει ρόλο αυτό..

Να προτείνω κάτι άλλο... Μπορούμε να κάνουμε mid στο ln και να το κάνουμε insert σε SQL πίνακα;

Δημοσ.

Δοκίμασε το τελικό αρχείο να το σώσεις σε windows-1253.

 

Δηλαδή όταν το κάνεις write στην VB κάνε το εξής:

 

>
System.IO.File.WriteAllLines(SaveFileDialog1.FileName, newFileLines, System.Text.Encoding.GetEncoding("Windows-1253"))

Δημοσ.

Δυστυχώς το αποθηκεύει με σύμβολα (σταυρούς και κουτάκια)

 

Δεν μπορώ να καταλάβω γιατί. Βεβαιώσου ότι στην εντολή έγραψες GetEncoding("Windows-1253").

 

Μπορείς να τα κάνεις insert μέσα από τη VB την ώρα που τα διαβάζεις. Αλλά ας αποκλείσεις πρώτα τα παραπάνω.

Δημοσ.

Έσβησα το αρχείο και δούλεψε! Από τα ανήκουστα.. Όντως το αποθηκεύει ως ANSI...

Θα ήταν ωραίο όμως να το κάναμε και κατευθείαν insert.. Πάω να μελετήσω το τρόπο και θα επιστρέψω!

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...