Κυριακή 28 Φεβρουαρίου 2016

Εγχειρίδιο της Μ2000 - Τεύχος 21ο

11. Αρχεία Κειμένου

Τα αρχεία κειμένου είναι αρχεία αλφαριθμητικών. Είδαμε στο κεφάλαιο 10 το έγγραφο και πως χειριζόμαστε την εισαγωγή και εξαγωγή σε αρχείο με μια εντολή. για όλο το έγγραφο, ή όλο το αρχείο, ή και τα δύο. Εδώ η σκοπιμότητα είναι στο να έχουμε μια διαφορετική αφετηρία, από ένα έγγραφο, όταν μαζεύουμε στοιχεία για να τα γράψουμε σε ένα αρχείο και επίσης διαφορετικό τέρμα όταν διαθέτουμε στοιχεία που διαβάζουμε από αρχείο, από ένα έγγραφο και εδώ.

Τα αρχεία κειμένου της Μ2000 είναι δυο κατηγοριών. Αρχεία UTF-16LE ή όπως τα λέμε για ΕΥΡΕΙΑ διεργασία (Εισαγωγή, Εξαγωγή, Συμπλήρωση, Πεδία), όπου κάθε χαρακτήρας έχει 2 bytes στο αρχείο. και το ANSI με ένα byte.


11.1 Απλά Αρχεία Κειμένου, Σειριακής Προσπέλασης
Ένα απλό αρχείο κειμένου κατασκευάζεται με σειρές αλφαριθμητικών. Όταν το αλφαριθμητικό περιέχει τη σειρά χαρ$(13)+χαρ$(10) ή CR LF (carriage return και line feed) ή μόνο το CR ή μόνο το LF τότε έχουμε αλλαγή παραγράφου. Αν θέλουμε το βλέπουμε και ως γραμμή, αλλά οι γραμμές σε μια παράγραφο έχουν να κάνουν με το πλάτος στο αντικείμενο εμφάνισης π.χ. στην οθόνη ή στη σελίδα του εκτυπωτή, ενώ στο αρχείο δεν έχουμε εμφάνιση, άρα δεν μιλάμε για αλλαγή γραμμής αλλά αλλαγή παραγράφου. Γίνεται αντιληπτό αυτό στον διορθωτή κειμένου όπου με το πλήκτρο F1 αλλάζουμε μεταξύ δυο συστημάτων προβολής, με αναδίπλωση λέξεων ή χωρίς αναδίπλωση - η παράγραφος εμφανίζεται ως μια γραμμή.
Κάθε φορά που ανοίγουμε ένα αρχείο για εξαγωγή ...σβήνονται τα περιεχόμενά του.


Η συνάρτηση χαρ$(13) παίρνει τιμές από 0 έως 255 και γυρίζει το utf-16le  αντίστοιχο δηλαδή  δύο bytes. Η χαρκωδ$()  πσίρνει κωδικους unicode και τους επιστρέφει σε δυο ή τέσσερα bytes (τέσσερα έχουν τα surrogates, αντικαταστάτες για τιμές από 0x10000).Τα αλφαριθμητικά στην Μ2000 εξ ορισμού είναι σε utf-16le εκτός αν γράψουμε ότι θέλουμε, και αυτό γίνεται αν θέλουμε. Σημασία έχει να χειριστούμε τα δεδομένα μέσα στο αλφαριθμητικό βάσει της κωδικοποίησης που έχουν (ή δεν έχουν επίτηδες, δηλαδή είναι δυαδικά δεδομένα, οτιδήποτε).
Όταν γράφουμε κείμενο σε αρχείο σε ANSI το κάνουμε σπό κείμενο που είναι σε utf-16Le. Όταν διαβάζουμε από ANSI γίνεται μετατροπή σε UTF-16Le. Υπάρχει δυνατότητα να διαβάσουμε ή να γράψουμε ένα αρχείο με διαρθρώσεις μνήμης (buffers), και έτσι δουλεύουν τα δυαδικά αρχεία. Εδώ θα δούμε τα αρχεία κειμένου. Η μετατροπή σε ή από ANSI γίνεται βάσει της επιλεγμένης κωδικοσελίδας. Η εντολή ΕΛΛΗΝΙΚΆ θέτει την κωδικοσελίδα στα ελληνικά. 

\\ η έναονομα$ είναι μεταβλητή  μόνο για ανάγνωση και κάθε φορά ένα μοναδικό όνομα με κατάληξη tmp, το οποίο το σύστημα σβήνει στο τερματισμό του διερμηνευτή
\\ περιέχει το κατάλογο (μονοπάτι), που είναι ο φάκελος προσωρινών αρχείων
\\ το βάζουμε σε στατική για να γράφουμε πάνω στο ίδιο, αν τρέξουμε άλλη φορά το τμήμα.
Στατική α$=έναόνομα$
\\ δεν θα βάλουμε ΒΟΜ δηλαδή τον χαρακτήρα...
\\ .... που δηλώνει τι κωδικοποίηση έχει το αρχείο
\\ επειδή μπορούμε να κάνουμε τη δουλειά μας χωρίς αυτό
\\ αλλά θα το ήθελε αν το ανοίγαμε με το Notepad.exe
Άνοιξε α$ για ευρεία εξαγωγή ως κ
      Τύπωσε #κ, "Μια γραμμή"
      Τύπωσε #κ, "Και άλλη μια γραμμή"
Κλείσε #κ
Αναμονή 100 \\ να είμαστε σίγουροι πως έχει γραφτεί
Άνοιξε α$ για ευρεία εισαγωγή ως κ
\\ απαραίτητα κοιτάμε αν υπάρχει κάτι
\\ πριν να εισάγουμε!
Ενώ όχι τέλος(#κ) {
      Γραμμή Εισαγωγής #κ, μιαγραμμή$
      Αναφορά μιαγραμμη$
}
Κλείσε #κ


Μπορούμε να συμπληρώσουμε ένα αρχείο, δηλαδή να μην το σβήσουμε και να προσθέσουμε γραμμές.
α$="αλφαβητα"  \\ χωρίς κατάλογο θα πάρει τον τρέχοντα
Άνοιξε α$ για ευρεία εξαγωγή ως κ
      Τύπωσε #κ, "Μια γραμμή"
      Τύπωσε #κ, "Και άλλη μια γραμμή"
Κλείσε #κ
Άνοιξε α$ για ευρεία συμπλήρωση ως κ
      Τύπωσε #κ, "Μια 3η γραμμή"
      Τύπωσε #κ, "Και άλλη μια, η 4η γραμμή"
Κλείσε #κ
Αναμονή 100


Άνοιξε α$ για ευρεία εισαγωγή ως κ
Ενώ όχι τέλος(#κ) {
      Γραμμή Εισαγωγής #κ, μιαγραμμή$
      Αναφορά μιαγραμμη$
}
Κλείσε #κ
\\ εκτελούμε εντολή σε κονσόλα χωρίς να ανοίξει μπροστά μας
\\ εδώ θα το σβήσουμε με εντολή από τη κονσόλα
Κονσόλα "del "+παράθεση$(κατ$+α$);


Η del δουλεύει ακόμα και αν στην κονσόλα δεν εμφανίζονται ελληνικά όταν πληκτρολογούμε. Αυτό γίνεται γιατί το μέρος της εμφάνισης έχει πρόβλημα, εσωτερικά δέχεται η εντολή το unicode όνομα (που εδώ έχει ελληνικά). Η κονσόλα ξεκινάει χωρίς να την δούμε γιατί έχουμε βάλει το ";" στο τέλος. Βάλτε το παρακάτω. Θα μείνει ανοιχτή η κονσόλα και θα γράφει OK,

Κονσόλα "del "+παράθεση$(κατ$+α$)+ " && echo OK"

11.2 Απλά αρχεία κειμένου με χρήση δρομέα για εισαγωγή.

Κάθε αρχείο έχει έναν δρομέα, είτε γράφουμε σε αυτό είτε διαβάζουμε. Δρομέας είναι ένας αριθμός που αλλάζει καθώς μεταφέρουμε από το αρχείο ή προς το αρχείο δεδομένα (όπως υπάρχει στην οθόνη, αλλά εκεί ορίζεται σε δυο διαστάσεις, και διαβάζουμε σε μεταβλητές γραμμή και θέση, ενώ αλλάζουμε με την Δρομέας 0,0  ή την Τύπωσε @(0,0) ή ότι άλλο ζευγάρι τιμών δώσουμε).

Στα αρχεία κειμένου έχουμε δρομέα που δείχνει στην θέση εγγραφής ή ανάγνωσης ξεκινώντας από το 1. Υπάρχει περίπτωση η θέση που δείχνει ο δρομέας να μην υπάρχει στο αρχείο. Αυτή είναι η επόμενη που θα γραφτεί. Έτσι ένα κενό αρχείο δείχνει θέση δρομέα 1, ενώ δεν υπάρχει η θέση, δεν έχει ακόμα δημιουργηθεί.
Εδώ έχουμε το προηγούμενο παράδειγμα με διαφοροποίηση. Έχουμε φτιάξει μια ομάδα (αντικείμενο) που κρατάει δείκτες μετάθεσης στο αρχείο. Κάθε φορά πριν γράψουμε σε αυτό κρατάμε την θέση του δρομέα. Έτσι στο παράδειγμα ανοίγουμε το αρχείο και διαβάζουμε πρώτα τη δεύτερη γραμμή και μετά τη πρώτη (αν ήταν απλά σειριακό το αρχείο θα διαβάζαμε με τη σειρά). Αυτό γίνεται γιατί μπορούμε να μεταθέτουμε τον δρομέα του αρχείου. Στο πρόγραμμα εδώ όπως και στο προηγούμενο μπορούμε μόνο να εισάγουμε από αυτό, όταν το ανοίγουμε για εισαγωγή.
Ο δρομέας του αρχείου δείχνει θέση Byte. Εδώ έχουμε unicode (ευρεία) αλλά επειδή δεν κάνουμε υπολογισμούς θέσεων, δεν φαίνεται αυτό. Απλά αποθηκεύουμε ό,τι νούμερο μας δώσει το διερμηνευτής.

Στατική α$=έναόνομα$
Ομάδα Αλφα {
Ιδιωτικό:
      Πίνακας Α()
      νέο_α
      Τμήμα δικόμου {
                  Διάβασε Χ, Ζ
                  Μετάθεση #Χ, .Α(Ζ-1)
                  Γραμμή Εισαγωγής #Χ, α$
                  Βάλε α$
            }
Δημόσιο:
      Τμήμα ΒάλεΈνα {
            Διάβασε Χ
            .νέο_α++
            Πίνακας .Α(.νέο_α)
            .Α(.νέο_α-1)=μετάθεση(#Χ)
      }
      Συνάρτηση ΣτοΣημείο$ {
            \\ οι στατικές έχουν προτεραιότητα
            \\ και είναι κοινές σε κλήσεις συναρτήσεων.
            \\ οπότε τις απομονώνουμε
            .Δικόμου
            =Γράμμα$
      }      
}
Άνοιξε α$ για ευρεία εξαγωγή ως κ
      Αλφα.ΒάλεΈνα κ
      Τύπωσε #κ, "Μια γραμμή"
      Αλφα.ΒάλεΈνα κ
      Τύπωσε #κ, "Και άλλη μια γραμμή"
Κλείσε #κ
Αναμονή 100 \\ να είμαστε σίγουροι πως έχει γραφτεί
Άνοιξε α$ για ευρεία εισαγωγή ως κ
      Τύπωσε Άλφα.ΣτοΣημείο$(κ,2)
      Τύπωσε Άλφα.ΣτοΣημείο$(κ,1)
Κλείσε #κ



Kαλό είναι οι στατικές να έχουν μεγάλο όνομα και μοναδικό, ή η χρήση τους να είναι περιορισμένη, απλά τις χρησιμοποιούμε όταν θέλουμε να τρέχουμε κάτι πολλές φορές και να μην αλλάζουν κάποιες τυχαίες επιλογές που δόθηκαν μια φορά όπως εδώ το όνομα ενός αρχείου .tmp
Το όνομα αρχείου που δίνει η έναόνομα$ είναι προσωρινό, στο πέρας της εκτέλεσης του m2000.exe το αρχείο θα σβηστεί αυτόματα.


Η εντολή Γραμμή Εισαγωγής τραβάει όλη τη γραμμή μέχρι το τέλος. Θα μπορούσαμε να τραβήξουμε έναν αριθμό στοιχείων, αν κάνουμε μερικές παραλλαγές. Εδώ μάλιστα επειδή προσθέτουμε το επιπλέον (offset) πρέπει να κάνουμε δυο πράγματα, να προσαρμόσουμε το επιπλέον να δουλεύει από το 0, άρα αφού εμείς μετράμε από το 1 θα αφαιρέσουμε ένα, και θα πρέπει να το διπλασιάζουμε αφού εμείς δίνουμε θέση χαρακτήρα ενώ θέλουμε θέση byte (εδώ είναι 2 byte ο χαρακτήρας). Έτσι ο τύπος είναι Αρχική_Θέση+(θέση_χαρακτήρα-1)*2, Με θέση χαρακτήρα 1 θα πάρουμε την Αρχική_Θέση, με 2 θα πάμε 2 bytes ..μετά..κ.ο.κ. (και όπως καταλαβαίνουμε).

Στατική α$=έναόνομα$
Ομάδα Αλφα {
Ιδιωτικό:
      Πίνακας Α()
      νέο_α
      Τμήμα δικόμου {
                  Διάβασε Χ, Ζ
                  Μετάθεση #Χ, .Α(Ζ-1)
                  Αν όχι κενό τότε {
                        Διάβασε Πόσα
                        Αν όχι κενό τότε {
                              Διάβασε ΠόσαΑκόμα
                              Άλλαξε Πόσα, ΠόσαΑκόμα
                              \\ η μετάθεση δουλεύει με bytes άρα επί 2
                              \\ αφού έχουμε Unicode
                              Μετάθεση #Χ, Μετάθεση(#Χ)+(ΠόσαΑκόμα-1)*2
                        }
                       Βάλε εισαγωγή$(#Χ,Πόσα)
                  } Αλλιώς {
                        Γραμμή Εισαγωγής #Χ, α$
                        Βάλε α$
                  }
            }
Δημόσιο:
      Τμήμα ΒάλεΈνα {
            Διάβασε Χ
            .νέο_α++
            Πίνακας .Α(.νέο_α)
            .Α(.νέο_α-1)=μετάθεση(#Χ)
      }
      Συνάρτηση ΣτοΣημείο$ {
            \\ οι στατικές έχουν προτεραιότητα
            \\ και είναι κοινές σε κλήσεις συναρτήσεων.
            \\ οπότε τις απομονώνουμε
            .Δικόμου
            =Γράμμα$
      }      

}
Άνοιξε α$ για ευρεία εξαγωγή ως κ
      Αλφα.ΒάλεΈνα κ
      Τύπωσε #κ, "Μια γραμμή"
      Αλφα.ΒάλεΈνα κ
      Τύπωσε #κ, "Και άλλη μια γραμμή"
Κλείσε #κ


Αναμονή 100 \\ να είμαστε σίγουροι πως έχει γραφτεί
Άνοιξε α$ για ευρεία εισαγωγή ως κ
      Τύπωσε Άλφα.ΣτοΣημείο$(κ,2)
      Τύπωσε Άλφα.ΣτοΣημείο$(κ,2,3)
      Τύπωσε Άλφα.ΣτοΣημείο$(κ,2,5,4)
      Τύπωσε Άλφα.ΣτοΣημείο$(κ,1)
Κλείσε #κ


11.3 Εξαγωγή στοιχείων σε λίστα με κόμμα διαχωριστικό.

Η Μ2000, ανεξάρτητα από το αν έχουμε το κόμμα ή την τελεία ως επιλογή δεκαδικών, στην καταχώρηση σε αρχείo csv (comma-separated values),  στέλνει τους αριθμούς με τελεία για διαχωριστικό δεκαδικών. Αυτό βοηθάει στο διάβασμα τιμών από το αρχείο. Γιατί στο διάβασμα μόνο η τελεία ως διαχωριστικό δεκαδικών είναι επιτρεπτή. Από την αναθεώρηση 169 υπάρχει επιπλέον ένας τρόπος να επιλέξουμε το χαρακτήρα διαχωρισμού πεδίων και μαζί το χαρακτήρα για την υποδιαστολή (το σύμβολο χωρισμού των δεκαδικών από την ακέραια τιμή). Όμως παραμένει το διάβασμα των αρχείων με τα προκαθορισμένα σύμβολα.

Στο παράδειγμα ετοιμάζουμε ένα csv για να διαβαστεί από το excel σε unicode και με τους χαρακτήρες που χρειάζεται. Καλούμε το excel και βλέπουμε ότι την τελευταία γραμμή την πήρε ως τύπους!
Μετά φορτώνουμε σε ένα έγγραφο το αρχείο και το σώνουμε σε νέο όνομα (εδώ πρέπει να δώσουμε τον τρόπο εξαγωγής να είναι 0, δηλαδή UTF-16LE),  Αν θέλουμε το ανοίγουμε και αυτό στο excel
Μετά δουλεύουμε στο έγγραφο και κάθε παράγραφο την αναλύουμε περνάμε με τη χρήση των αριστερόμέρος$() και δεξιμέρος$() και βγάζουμε τα στοιχεία. Εδώ θα μπορούσαμε να βάλουμε το Αποκ$() που αποκόπτει τα διαστήματα, αλλά ξέρουμε ότι η προηγούμενη διαδικασία δεν αφήνει διαστήματα. η       Καταχώρηση ι Excel$=τελικο$  βάζει  στη παράγραφο ι μια νέα παράγραφο.

κ=1
\\ με χρήση BOM (ενδεικτικού χαρακτήρα)
\\ το 0xE δίνει το σύμβολο για τα δεκαδικά - μπορεί να είναι το κόμμα ή η τελεία.
Τοπικό 1032
Κάνε ΑλλαξεΤελεία$(α$)=αλλαγη$(".",τοπικο$(0xE),α$)
Δες οκ {
Άνοιξε "αλφα.csv" για ευρεία εξαγωγή ως κ
}
Αν όχι οκ Τότε Λάθος "Δεν μπορώ να ανοίξω το αρχείο αλφα.csv"
      Τύπωσε #κ, χαρκωδ$(0xFEFF);  \\ λέγεται BOM και μαρκάρει το κείμενο ως UTF-16LE
      \\ οι αριθμοί στο κώδικα γράφονται πάντα με τελεία για δεκαδικό
      \\ στην εμφάνιση στην Τύπωσε βγαίνουν βάσει του τοπικού
      Γράψε με χαρ$(9), τοπικο$(0xE)
      Γράψε #κ, "Τιμή Α", "Τιμή Β","Αποτέλεσμα Κ"
      Γράψε #κ, 12.24, 213.23, 213.23+12.24
      Γράψε #κ, 15.24, 215.23, 215.23+15.24
      Γράψε #κ, ΑλλαξεΤελεία$("=A2+A3*2.5"),ΑλλαξεΤελεία$("=B2+B3*2.5"),ΑλλαξεΤελεία$("=C2+C3*2.5")
Κλείσε #κ
Γράψε με "",""  \\ κάνουμε επιστροφή στις τιμές κόμμα και τελεία
Σύστημα "Excel.exe "+παράθεση$(κατ$+"αλφα.csv")
Έγγραφο Excel$
Αναμονή 5000
{
      Δες οκ {
            \\ αν είναι ανοιχτό με το Excel είναι για αποκλειστική χρήση
            \\ οπότε βγαίνει λάθος η συμπλήρωση (append)
            Άνοιξε "αλφα.csv" για συμπλήρωση ως κ
            Κλείσε #κ
            Φόρτωσε.Έγγραφο Excel$, "αλφα.csv"
      }
            αν λάθος ή οχι οκ τότε αναμονή 100 : κυκλικα
      }
Σώσε.Έγγραφο Excel$, "αλφα0.csv", 0
Σημ 1 : Σύστημα "Excel.exe "+παράθεση$(κατ$+"αλφα0.csv")

Αναφορά Excel$
\\ Μετατροπή από εξαγωγή του excel στο βασικό csv με κόμμα και τελεία.
Αν τοπικο$(0xE)<>"." Τότε {
      Για ι=1 έως Εγγράφου.Παρ(Excel$) {
            καθ$=παράγραφος$(Excel$,ι)+χαρ$(9)
            Έγγραφο τελικο$
            Ενώ καθ$<>"" {
                  καθ1$=αριστερομερος$(καθ$, χαρ$(9)) : καθ$=δεξιμερος$(καθ$, χαρ$(9))
                  καθ1$=αλλαγη$(τοπικο$(0xE),".",καθ1$)
                  Αν Εγγράφου.Μήκος(τελικο$)=0 τότε {
                        τελικο$=καθ1$
                  } Αλλιώς τελικο$=","+καθ1$
            }
            καθ$=τελικο$+"," : Καθαρό τελικο$
            Ενώ καθ$<>"" {
                  καθ1$=αριστερομερος$(καθ$, ",") : καθ$=δεξιμερος$(καθ$, ",")
                  \\ βάζουμε εισαγωγικά με την Παράθεση$() αν χρειάζεται
                  Αν όχι Δεξι$(καθ1$,1) ~ "[+-1234567890"+Χαρ$(34)+"]" τότε καθ1$=Παράθεση$(καθ1$)
                  Αν Εγγράφου.Μήκος(τελικο$)=0 τότε {
                        τελικο$=καθ1$
                  } Αλλιώς τελικο$=","+καθ1$
            }


            Καταχώρηση ι Excel$=τελικο$
            Καθαρό τελικο$ \\ καθαρίζουμε το έγγραφο
      }
}
Αναφορά Excel$
Σώσε.έγγραφο Excel$, "αλφα1.csv", 0


\\ Άνοιγμα του τροποποιημένου αρχείου, με κόμμα και τελείες.
Άνοιξε "αλφα1.csv" για ευρεία εισαγωγή ως κ
      Εισαγωγή #κ, τ1$, τ2$, τ3$
      Τύπωσε τ1$, τ2$, τ3$
      Για ι=1 έως 2 {
            Εισαγωγή #κ, τ1, τ2, τ3
            Τύπωσε τ1, τ2, τ3
      }
      Γραμμή Εισαγωγής #κ, ολα$
      Σωρός ολα$ \\ μεταφέρει στην κορυφή ότι έχει η γραμμή
      Δες Οκ {
            Διάβασε τ1$, τ2$, τ3$
            Τύπωσε τ1$, τ2$, τ3$
      }
      Αν όχι Οκ τότε {
            Διάβασε τ1, τ2, τ3
            Τύπωσε τ1, τ2, τ3
      }
Κλείσε #κ




(συνεχίζεται στο επόμενο)

Δεν υπάρχουν σχόλια:

Δημοσίευση σχολίου

You can feel free to write any suggestion, or idea on the subject.