Re: Αποφυγή αυτόματης εισαγωγής ημερ/νίας στο Open Office calc.

Konstantinos Togias ktogias at math.upatras.gr
Fri Aug 8 17:43:25 BST 2008


2008/8/8 Alexis Bitoulas <albitoulas at yahoo.gr>:
> Φίλοι καλημέρα σας,
>
> Ευχαριστώ για την ανταπόκριση.
>
> Το αρχείο που έστειλες Νίκο Γιαννάρο, επιβεβαιώνω και εγώ ότι περιέχει
> ακόμη κάποιες ημερομηνίες (κελιά Τ6, ΒΚ10) αν το ανοίξω είτε με το ΟΟ
> calc, είτε με το Gnumeric. Με το gedit δεν κατάφερα να το ανοίξω, λόγω
> "λανθασμένης κωδικοποίησης", όπως μου ανέφερε...
> Άρα, το πρόβλημα υπάρχει ακόμα.
>
> Επίσης, επιβεβαιώνω και τα σημεία που παρατήρησες Νίκο Αλεξανδρή, με τα
> κελιά που περιέχουν δύο τελείες αντί μία που είναι το σωστό. Δεν ξέρω
> κατά πόσο αυτά τα κελιά είναι η αιτία για το πρόβλημα.
>
> Αν κάποιος άλλος έμπειρος με το ΟΟcalc, έχει υπόψιν του κάτι, θα το
> εκτιμούσα πολύ!
>
> Διαφορετικά, μήπως μπορούμε να το αναφέρουμε κάπου πιο "πάνω", εννοώ
> launchpad ή σε κάποιον άλλο υπεύθυνο για το ΟΟcalc. Επειδή δεν ξέρω και
> πολλά πέρα από τη λίστα μας και το φόρουμ μας, αν μπορείτε δώστε μου
> κάποιες κατευθύνσεις, σε περίπτωση που δεν το λύσουμε μόνοι μας το
> πρόβλημα.
>
> Σας ευχαριστώ όλους,
>
> Φιλικά,
>
> --
> Αλέξης
>
>
>
> --
> Ubuntu-gr mailing list
> Ubuntu-gr at lists.ubuntu.com
>
> If you do not want to receive any more messages from the ubuntu-gr mailing list, please follow this link and choose unsubscribe:
> https://lists.ubuntu.com/mailman/listinfo/ubuntu-gr
>

Γεια σας,

Κοίταξα λίγο το πρόβλημα με το csv αρχείο και έχω τα εξής σχόλια:

1. Το πρόβλημα με τη μετατροπή των δεκαδικών με τελεία (.) σε
ημερομηνίες πρέπει να έχει να κάνει με την τοπικοποίηση του
openoffice. Όταν το calc είναι σε εξελληνισμένο περιβάλλον
αντιλαμβάνεται σαν χαρακτήρα διαχωρισμού ακεραίου από δεκαδικό μέρος
το κόμμα (,), ενώ την τελεία (.) την ερμηνεύει ως διαχωριστικό μήνα,
μέρας, έτους σε ημερομηνίες. Έτσι τους αριθμούς που περιέχουν . τους
ερμηνεύει σαν ημερομηνίες και όχι σαν δεκαδικούς. Δεν ξέρω αν - από
που ρυθμίζεται αυτή η συμπεριφορά, αλλά θα μπορούσε να δοκιμάσει
κάποιος που έχει αγγλικό περιβάλλον και αγγλικό openoffice να μας πει
αν η συμπεριφορά εκεί είναι πιο κοντά στην αναμενόμενη (δηλ οι τελείες
ερμηνευονται ως δεκαδικοί και όχι ως ημερομηνίες).

2. Στο αρχείο υπάρχουν τιμές της μορφής 23..5 που είναι λογικό να
δημιουργούν πρόβλημα . Δεν ξέρω τι κάνει και τι θα έπρεπε να κάνει το
calc όταν συναντά τέτοιες τιμές. Η ύπαρξη  της διπλής τελείας, αν δεν
είναι για κάποιο λόγο ηθελημένη, αποτελεί σφάλμα του προγράμματος που
παρήγαγε το CSV αρχείο.

3. Το calc για κάποιο λόγο αρνείται να φορτώσει όλες τις γραμμές του
CSV . Φορτώνει τις 11 πρώτες και στη συνέχεια βγάζει ένα μήνυμα για
υπέρβαση μέγιστου ορίου γραμμών. Κάποιος πρέπει να δει πως είναι το
μήνυμα αυτό στα και να ψάξει λίγο στο google για το τι σημαίνει και
αν/από που ρυθμίζεται - παρακάμπτεται το μέγιστο όριο γραμμών

4. Κατα προσωπική μου γνώμη τα παραπάνω (πέραν της διπλής τελείας
ίσως) οφείλονται σε ελλειπή υλοποίηση και έλλειψη επιλογών στη
διαδικασία εισαγωγής CSV αρχείων από μεριάς του openoffice 2.4.1 . Ας
ελπίσουμε ότι τα πράγματα θα είναι καλύτερα στο ooo3 .

5. Επειδή όμως είμαστε στον κόσμο του Unix (και ειδικότερα του
υπέροχου ελεύθερου linux) πολλά μπορούν να διορθωθούν εύκολα και
γρήγορα όταν έχουμε να κάνουμε με αρχεία κειμένου, με τη χρήση
εξωτερικών προγραμμάτων επεξεργασίας ροών κειμένου (stream editors),
όπως το sed ή το awk που με τη βοήθεια των κανονικών εκφράσεων
(regular expressions) αποτελούν πανίσχυρα εργαλεία και μας επιτρέπουν
να μεταμορφώνουμε αρχεία κειμένου όπως το CSV για το οποίο μιλάμε. Με
το sed λοιπόν μπορεί κάποιος να εξαφανίσει τις διπλές -τριπλές κλπ
τελείες και να τις αντικαταστήσει με μία μόνο τελεία, να αλλάξει τα
διαχωριστικά των κελιών από κόμματα σε κάτι άλλο, και μετά να αλλάξει
τις διαχωριστικές τελείες σε κόμματα, ωστε οι αριθμοί να αποκτήσουν
ελληνοποιημένη μορφή (κόμμα αντί τελεία για δεκαδικά). Η εντολή που
έτρεξα εγώ από το τερματικό είναι η εξής:

sed 's/\([0-9]\)\.\.\([0-9]\)/\1\.\2/g' < download.csv | sed 's/,/|/g'
| sed 's/\./,/g' > download.corrected.csv

Η παραπάνω εντολή μπορεί αρχικά να φαίνεται λίγο ακαταλαβίστικη, αλλά
μολις την σπάσει κάποιος σε τμήματα και συνηθίσει τη σύνταξη των
κανονικών εκφράσεων θα ξετυλιχτεί μπροστά του όλη η ομορφιά της:

α. Η γραμμή αποτελείται από διαδοχικές διασωληνώσεις (pipes) 3
εκτελέσεων του προγράμματος sed. Τα διασωληνωμένα τμήμα διαχωρίζονται
με τον χαρακτήρα | όταν αυτός δεν βρίσκεται μέσα σε μονά εισαγωγικά
(').

β. Η πρώτη εντολή εκτελεί το sed με είσοδο το αρχείο download.csv και
με την κανονική έκφραση  s/\([0-9]\)\.\.\([0-9]\)/\1\.\2/g που
βρίσκεται ανάμεσα σε απλά εισαγωγικά. Η κανονική έκφραση
s/\([0-9]\)\.\.\([0-9]\)/\1\.\2/g λέει στο sed να αντικαταστήσει όλες
τις εμφανίσεις δυο συνεχόμενων χαρακτήρων τελεία που βρίσκονται
ανάμεσα σε δυο αριθμητικούς χαρακτήρες, με μια μόνο τελεία που
βρίσκεται ανάμεσα σε αυτούς τους χαρακτήρες.

γ. Η δεύτερη εντολή θα τρέξει με είσοδο την έξοδο της προηγούμενης και
με βάση τα όσα λέει η δική της κανονική έκφραση θα αντικαταστήσει όλα
τα κόμματα με τον χαρακτήρα | .

δ. Συνεχίζοντας τη διασωλήνωση όταν η ροή κειμένου φτάσει στην τρίτη
εντολή οι τελείες θα αντικατασταθούν με κόμματα.

ε. Η έξοδος της τελευταίας εντολής ανακατευθύνεται με τον χαρακτήρα >
από το κέλυφος στο αρχείο  download.corrected.csv .

Έτσι το αρχείο download.corrected.csv περιέχει τα δεδομένα που είχε το
download.csv, χωρίς διπλές τελείες, με | αντί για κόμματα για το
διαχωρισμό των κελιών και με , αντι για . για το διαχωρισμό ακέραιου
και δεκαδικού μέρους. Το παραγώμενο αρχείο το άνοιξα με  calc σε
ελληνικό περιβάλλον επιλέγοντας στο "διαχωριζόμενα με" "άλλο" και
ορίζοντας τον χαρακτήρα | ως διαχωριστικό και το άνοιξε χωρις (προφανή
τουλάχιστον) λάθη. Οι αριθμοί αναγνωρίστικαν κανονικά ως δεκαδικοί με
κόμμα, και δεν υπήρχαν ημερομηνίες. Βέβαια πάλι το calc αρνήθηκε να
εισάγει όλες τις γραμμές του CSV.

Παραπομπές:

Sed - An introduction and tutorial : http://www.grymoire.com/Unix/Sed.html

Introducing Unix shell pipes: http://sig9.com/articles/unix-pipes-intro

-- 
Konstantinos Togias
Dipl.-Math., M.Sc.
Research Academic Computer Technology Institute


More information about the Ubuntu-gr mailing list