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

Αναθεώρηση 172

Διόρθωσα στη Μορφή$() ενός λάθους και πρόσθεσα και πεδίο για τα αλφαριθμητικά:

Τύπωσε μορφή$("{0:-20}={1:3:10}", "άλφα", 12.2234)
Τύπωσε μορφή$("{0:-20}:{1:4:-10},{1:4:-10}", "άλφα", 123.178678, 343534.3453453465)
Τύπωσε μορφή$("{0:20}", "άλφα")

Επίσης διόρθωσε την εντολή ΣΩΣΕ ώστε να σώνει με την σωστή σειρά (όπως τα δημιουργήσαμε) τα τμήματα και τις συναρτήσεις. Είχε αλλάξει στις τελευταίες αναθεωρήσεις!




Εγχειρίδιο της Μ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
      }
Κλείσε #κ




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

Αναθεώρηση 171 (αλλαγή)

Η 170 είχε ένα λάθος στο νέο κώδικα διορθώθηκε και  έγινε 171.
Αν θέλει κανείς να παρακολουθεί τις αλλαγές, και τις προηγούμενες, ας δει το Git όπου κρατούνται οι αλλαγές.


Σε αυτήν την αναθεώρηση άλλαξα μερικές ακόμα ρουτίνες του λειτουργικού από τις ANSI στις UNICODE και ειδικότερα αυτές που ήταν σε μια κλάση που είχα συμπεριλάβει από κώδικα άλλου. Έγινε η μετατροπή καθώς και μια παρόμοια για τα ονόματα των φακέλων, ώστε να μπορούμε σε Windows που δεν έχουν ελληνικά ως τη γλώσσα για μη unicode προγράμματα να δουλεύει η M2000 τέλεια!
Όταν υπάρχει υποστήριξη και χρησιμοποιεί κανείς τις ρουτίνες για ANSI δεν υπάρχει πρόβλημα. Δυστυχώς ο κώδικας που είχα συμπεριλάβει ήταν φτιαγμένος για Windows 95 και σε αυτά δεν υπήρχε υποστήριξη unicode στο σύστημα, παρόλο που η VB6 το υποστήριζε εσωτερικά. Οπότε έκανε το εξής η Vb6, μετέτρεπε το Unicode σε ANSI, το έδινε σε μια ρουτίνα του λειτουργικού η οποία το μετέτρεπε σε UNICODE και έκανε την σωστή κλήση με UNICODE. Έτσι αν έτρεχε το πρόγραμμα σε Windows 95 τότε απλά δεν θα γινόταν η τελευταία μετατροπή στη μεριά του συστήματος!
Τώρα η Μ2000 δεν έχει συμβατότητα με Windows 95 (είχε σπάσει από καιρό). Κάτι που δεν μας ενοχλεί βέβαια!






Σάββατο 27 Φεβρουαρίου 2016

Αναθεώρηση 169 (σημαντική)

Στην αναθεώρηση 169 διόρθωσα ένα πρόβλημα στην χρήση αρχείων με την Άνοιξε/Open, στη χρησιμοποίηση του ";", δημιουργούσε σε μετέπειτα γραμμές πρόβλημα με την μη αποστολή αλλαγή γραμμής.
Μαζί με την διόρθωση μπήκε και μια προσθήκη.

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


Προς το παρόν δεν διαβάζει η Μ2000 αυτό το csv άμεσα με Εισαγωγή #κ, γιατί θέλει το κανονικό, τελεία για δεκαδικά και κόμμα μεταξύ των πεδίων
Για να γυρίσουμε την εξαγωγή στο κανονικό:
Γράψε με "",""

Στο εγχειρίδιο τεύχος 21 θα δείξω και την ρουτίνα μετατροπής από το φορμά με τα tab (χαρ$(9)) και τα "," σε "," και ".".

(η συνάρτηση Παράθεση$ βάζει στο αλφαριθμητικό εισαγωγικά, και το κάνουμε αυτό γιατί  ο κατάλογος ή το όνομα μπορεί να περιέχουν κενά)

Παρασκευή 26 Φεβρουαρίου 2016

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

10.4 Επεξεργασία/Αλλαγές Εγγράφου

Ένα έγγραφο μπορούμε να το διορθώσουμε στον διορθωτή, ή προγραμματιστικά να κάνουμε αλλαγές, προσθήκη παραγράφων/ διαγραφή καθώς και εύρεση λέξεων αλλά και μετρήσεις!

 

10.4.1 Παρεμβολή κειμένου σε έγγραφο.

 
Με εντολές για αλφαριθμητικά όπως Παρεμβολή, όπου η αριθμητική έκφραση σχετίζεται με τη θέση:
 
Έγγραφο α$={Γιορτή
            Εκδήλωση
            Πάρτι
            Φεστιβάλ
            }
Στη ι=θέση(α$, "Πάρτι")
Παρεμβολή ι+5 α$="Μετά το πάρτι ακριβώς"
Παρεμβολή 8 α$="Πριν την Εκδήλωση"
Αναφορά α$


θα μπορούσε να γίνει χωρίς αντικείμενο έγγραφο:
 
β$={Γιορτή
            Εκδήλωση
            Πάρτι
            Φεστιβάλ
            }
Στη ι=θέση(β$, "Πάρτι")
Παρεμβολή ι+5 β$="Μετά το πάρτι ακριβώς"
Παρεμβολή 8 β$="Πριν την Εκδήλωση"
Αναφορά β$

Ή θα μπορούσαμε να αποφύγουμε το μπέρδεμα με τους υπολογισμούς των θέσεων από την αρχή του εγγράφου, αναφέροντας αριθμό παραγράφου (στη δεύτερη παρεμβολή λέμε και τη θέση στη παράγραφο:
 
Έγγραφο α$={Γιορτή
            Εκδήλωση
            Πάρτι
            Φεστιβάλ
            }
Παρεμβολή στο 2 α$="Πριν την Εκδήλωση"
Παρεμβολή στο 3,6 α$="Μετά το πάρτι ακριβώς"
Αναφορά α$

Όμως και αυτό μπορεί εδώ να δούλεψε αλλά αν στο 2 βάζαμε πολλές παραγράφους τότε η 3η παράγραφος θα ήταν άλλη και όχι μετά το πάρτι ακριβώς!
Μπορούμε όμως να πάρουμε το δείκτη της 3ης παραγράφου, ο οποίος δεν αλλάζει για αυτήν ακόμα και αν μετακινθεί, γίνει τέταρτη. Μόνο αν την σβήσουμε θα γίνει άκυρη. Αλλά ακόμα δεν ξέρουμε πώς!
 
Έγγραφο α$={Γιορτή
            Εκδήλωση
            Πάρτι
            Φεστιβάλ
            }
\\ παίρνουμε τον δείκτη της 3ης παραγράφου
κ=Παράγραφος(α$,3)
Παρεμβολή στο 2 α$={Πριν την Εκδήλωση
            Και άλλη γραμμή
            }
\\ η τρίτη παράγραφος μετακινήθηκε δυο παραγράφους πιο κάτω
\\ αλλά δεν μας πειράζει, ξέρουμε που έχει πάει!
\\ διότι δεν έχει αλλάξει ο δείκτης της (τον έχουμε στο κ)
Παρεμβολή στο αριθμός.παραγράφου(α$, κ),6 α$="Μετά το πάρτι ακριβώς"
Αναφορά α$
Τύπωσε Υπό \\ αλλαγή γραμμής με υπογράμμιση της προηγούμενης
Παρεμβολή 1 α$="Και εδώ πριν την "
Αναφορά α$

Οι συναρτήσεις Παράγραφος() και Αριθμός.Παραγράφου() είναι αντίστροφες. Η μία δίνει δείκτη από αριθμό σειράς και η άλλη αριθμό σειράς από δείκτη. Οι αριθμοί σειράς είναι αυτοί που δηλώνουν την σειρά εμφάνισης, ενώ ο δείκτης δηλώνει τον αριθμό παρουσίας. Μόλις μια νέα παράγραφος δημιουργηθεί παίρνει ένα αριθμό παρουσίας, που την ακολουθεί μέχρι να διαγραφεί. Αυτό μας βολεύει γιατί αν διαγραφούν παράγραφοι πριν ή προστεθούν ενώ θα αλλάξει ο αριθμός σειράς, δεν θα αλλάει ο δείκτης. Μπορούμε με τις Μπροστά() και Πίσω() να βρούμε τις επόμενες/προηγούμενες παραγράφους.
 
 

10.4.2 Διαγραφή παραγράφων σε έγγραφο

 
Θα δούμε δυο παραδείγματα. Ένα όπου αφαιρούμε μια παραγραφο και την βάζουμε ξανά στο τέλος, και ένα άλλο που αφαιρούμε δυο συνεχόμενες και τις βάζουμε σε άλλο έγγραφο
 
Έγγραφο α$={Γιορτή
            Εκδήλωση
            Πάρτι
            Φεστιβάλ
            }
Αναφορά α$
Τύπωσε Υπό
\\ αποκόπτω την δεύτερη παράγραφο
\\ και την κρατάω στη π$
π$=Παραγραφος$(α$,2,-1)
\\ την προσθέτω στο τέλος με αλλαγή παραγράφου
α$=π$+{
}
Αναφορά α$
Τώρα εξάγω μια προς μια τις παραγράφους και τις βάζω σε άλλο έγραφο. Με τον ίδιο τρόπο μπορώ να τις επεξεργαστώ και μετά να τις παρεμβάλω στις θέσεις τους, αλλά εδώ απλά με ενδιαφέρει να τις προσθέσω στο τέλος του εγγράφου.
 

Έγγραφο α$={Γιορτή
            Εκδήλωση
            Πάρτι
            Φεστιβάλ
            }
Αναφορά α$
Τύπωσε Υπό
\\ αποκόπτω την δεύτερη παράγραφο
\\ και την κρατάω στη π$, δυο φορές
\\ βάζω και αλλαγή παραγράφου
Έγγραφο π$
Για ι=1 έως 2 {
      π$=Παράγραφος$(α$,2,-1)+{
      }
}
\\ προσθέτω στο τέλος
α$=π$
Καθαρό π$
Αναφορά α$
 

10.4.3 Καταχώρηση σε παραγράφους

 
 
Η Καταχώρηση γράφει πάνω σε άλλες παραγράφους, αλλά μπορούμε να γράψουμε και σε θέσεις, που είτε υπάρχουν είτε δημιουργούνται (με προσθήκη διαστημάτων) σε μια παράγραφο:
 
Έγγραφο α$={Γιορτή
            Εκδήλωση
            Πάρτι
            Φεστιβάλ
            }
\\ αλλάζουμε τη 2η παράγραφο
Καταχώρηση 2 α$="Κενό"
\\ σβήνουμε δυο χαρακτήρες και βάζουμε ένα διάστημα
Καταχώρηση 3,3 α$=" "   \\ δεν βάζει απλά κενά αλλά με shift+ctrl+space
\\ το οποίο λέγεται non-breaking space
\\ ή με shift+alt+space διάστημα για αριθμούς
\\ βλέπουμε στο διορθωτή τους μη φανερούς χαρακtήρες με F10
\\ μπορώ να περάσω διαστήματα αν δεν είναι στις άκρες"
Καταχώρηση 4,3 α$="12 45"
' αν δεν υπάρχει η 20η θέση, τότε μπαίνουν διαστήματα
Καταχώρηση 1,40 α$="οκ"
αναφορά α$
Τύπωσε Υπό
Καταχώρηση 1 α$={Νέα πρώτη παράγραφος
      Και νέα δεύτερη παράγραφος
      }
αναφορά α$
Καταχώρηση 1, 5 α$="ΠΡΩΤΗ"
Τύπωσε Υπό
αναφορά α$

 

1.5 Εύρεση λέξης/φράσης σε παράγραφο

 
Για φράση δείτε όπου το Γιορτή το κάνουμε Γιο ρτή και δουλεύει. Η εύρεση δουλεύει χωρίς να κοιτάει πεζά και κεφαλαία, αλλά κοιτάει τόνους. Η εύρεση εδώ είναι με σειριακό τρόπο, από παράγραφο σε παράγραφο.
 
Έγγραφο α$={Διαγράφω αυτό
            Γιορτή Χαράς
            Εκδήλωση
            Πάρτι και Γιορτή Παιδιών
            Φεστιβάλ
            }
\\ πετάω τη πρώτη παράγραφο
πέταξέτο$=παράγραφος$(α$,1,-1)
Εύρεση α$, "ΓΙΟΡΤΉ"  \\ βρίσκει με τόνο μόνο
Διάβασε Τι
\\ διαβάζουμε 0 αν δεν βρει ή ένα νούμερο από το 1 που δηλώνει...
\\ ...θέση στο κείμενο αν το βλέπαμε σαν ένα αλφαριθμητικό
\\ αν δώσει μη μηδενική τιμή τότε δίνει και άλλες δυο
\\ αριθμό παραγράφου και
Αν Τι>0 τότε {
Διάβασε Παρ, Που
      \\ η τρίτη παράμετρος στην Παράγραφος$ δίνει
      \\ το αλφαριθμητικό από το σημείο που θέλουμε
      \\ προσοχή:
      \\ αν είναι αρνητικός τότε διαγράφει την παράγραφο!
      \\ αλλά μας δίνει ένα αντίγραφο! (εδώ θα πήγαινε χαμένο).
      Τύπωσε Παράγραφος$(α$, Παρ,Που)
}
\\ ψάχνουμε παρακάτω
Εύρεση α$,  "Γιορτή", τι+1
Διάβασε Τι
Αν Τι>0 τότε {
Διάβασε Παρ, Που
      Τύπωσε Παράγραφος$(α$, Παρ,Που)
}

10.6 Λίστα  Λέξεων και Μοναδικών Λέξεων σε Έγγραφο

 
Ο αλγόριθμος εσωτερικά στο διερμηνευτή είναι πολύ γρήγορος και δίνει ταξινομημένες όλες τις λέξεις. Αν έχουμε κάνει έλεγχο για διαφορετικές λέξεις μπορούμε να δούμε το αποτέλεσμα με την εντολή Λέξεις με τον αριθμό παρουσίας της κάθε λέξης. Ο αλγόριθμος είναι γρήγορος γιατί δεν μετακινεί αλφαριθμητικά, κάνει τις συγκρίσεις επιτόπου και χρησιμοποιεί δείκτες για τις αλλαγές, η δε αναζήτηση είναι δυαδική.

Έγγραφο α$={Διαγράφω αυτό
            Γιορτή Χαράς, 12-3-2016
            Εκδήλωση 12-2332-23
            Πάρτι και Γιορτή Παιδιών
            Φεστιβάλ 12,34,56
            }
Σωρός Νέος {
      Τύπωσε Εγγράφου.Λέξεις(α$) \\ 10
      \\ βάζει στο σωρό ταξινομημένες τις λέξεις
      \\ μόνο λέξεις!
      Λέξεις α$
      Ενώ όχι κενό {
            Τύπωσε Γραμμα$
      }
}
Τύπωσε Υπό
Σωρός Νέος {
      Τύπωσε Εγγράφου.Μοναδικές.Λέξεις(α$) \\ 9
      \\ βάζει στο σωρό ταξινομημένες τις λέξεις..
      \\ με τον αριθμό της εμφάνισης σε παρένθεση
      Λέξεις α$
      Ενώ όχι κενό {
            Τύπωσε Γραμμα$
      }
}
10.7 Ταξινόμηση σε έγγραφο
 

Μπορούμε να ταξινομούμε σε μια περιοχή παραγράφων αλλά και από μια θέση χαρακτήρα στη παράγραφο και μετά. Έτσι το έγγραφο μπορεί να έχει μεταβλητό κλειδί με σταθερού μήκους δεδομένα. Το αντίθετο, σταθερό κλειδί με μεταβλητό μήκος δεδομένων είναι εύκολα κατανοητό ότι γίνεται αν δεν μας ενδιαφέρουν τα όμοια κλειδιά ώστε να έχουμε κάποια αλλαγή σειράς. Η ρουτίνα ταξινόμησης είναι μια παραλλαγή της QuickSort. Οι μεταθέσεις δεν χαλάνε τους δείκτες παραγράφου, αλλάζουν άλλους δείκτες εσωτερικά (η λίστα του εγγράφου είναι δυναμική με δείκτες επόμενο και προηγούμενο)
Αν υποθέσουμε ότι έχουμε κλειδιά π.χ. στο 8ο χαρακτήρα τότε μπορούμε να εφαρμόσουμε δική μας δυαδική αναζήτηση ελέγχοντας με την παράγραφος$(α$,που, 8) το κλειδί που αναζητούμε.
 
Έγγραφο α$={Φεστιβάλ
            Γιορτή Χαράς
            Εκδήλωση
            Πάρτι και Γιορτή
            }
Ταξινόμηση α$, 1, 4 \\ αρχή από 1η παράγραφο, τέλος από 2η
Αναφορά α$
Τύπωσε Υπό
\\ ταξινόμηση με σταθερό πλάτος στοιχείων και μεταβλητό κλειδί
\\ εδώ το κλειδί είναι από τον 8ο χαρακτήρα
Έγγραφο β$={*420034Φεστιβάλ
            *004034Γιορτή Χαράς
            *000033Εκδήλωση
            *002031Πάρτι και Γιορτή
            }
Ταξινόμηση β$, 1, 4,8 \\ αρχή από 1η παράγραφο, τέλος από 2η
Αναφορά β$