Πρόβλημα με εισαγωγή date από csv

Συζητήσεις για την βάση δεδομένων MySQL και το phpMyAdmin

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
Apostolis_38
Δημοσιεύσεις: 1969
Εγγραφή: 14 Φεβ 2008 16:20
Τοποθεσία: ΠΕΙΡΑΙΑΣ

Πρόβλημα με εισαγωγή date από csv

Δημοσίευση από Apostolis_38 » 02 Οκτ 2010 12:54

Καλησπέρα σε όλους.

Το πρόβλημα είναι το εξής.

Εχω ένα πολύ απλό script στην php με το οποίο κάνω import data από csv files.

Κώδικας: Επιλογή όλων

//---OPEN AND GET CONTENTS OF FILE
$read = $_SERVER['DOCUMENT_ROOT']."uploads/".$file;
    $contents = file($read);

    for&#40;$i = 0; $i < sizeof&#40;$contents&#41;; $i++&#41; &#123;
        $line = trim&#40;$contents&#91;$i&#93;&#41;;
        $arr = explode&#40;",",$line&#41;; 

//---INSERT DATA INTO TABLE
        $query = "INSERT INTO ".$t." VALUES &#40;".implode &#40;',', $arr&#41;."&#41;";
Η MYSQL παίρνει τα date πεδία στην Αμερικάνικη μορφή YYYY-MM-DD.
Το πρόβλημα είναι οτι το csv δεν σώζει τα δεδομένα σε αυτή τη μορφή αλλά τα "γυρνάει" στην Ελληνική (DD/MM/YYYY) οπότε, φυσιολογικά, στην mysql περνιούνται μηδενικές τιμές (0000-00-00).

Εχει κανείς καμμιά ιδέα για το πως μπορεί να ξεπεραστεί το πρόβλημα;
Είτε με το script, είτε με το csv, είτε με τη mysql.

Apostolis_38
Δημοσιεύσεις: 1969
Εγγραφή: 14 Φεβ 2008 16:20
Τοποθεσία: ΠΕΙΡΑΙΑΣ

Πρόβλημα με εισαγωγή date από csv

Δημοσίευση από Apostolis_38 » 02 Οκτ 2010 13:26

Διαπίστωσα οτι με LOAD DATA INFILE από mysql shell τρέχει κανονικά.
Οπότε υποθέτω πως το πρόβλημα είναι στο

Κώδικας: Επιλογή όλων

$arr = explode&#40;",",$line&#41;;
ή στο

Κώδικας: Επιλογή όλων

VALUES &#40;".implode &#40;',', $arr&#41;."&#41;"
Σε κάποιο από αυτά δεν κρατάει τη σωστή μορφή της ημερομηνίας.

Καμμιά ιδέα;




Υ.Γ. κανονικά το θέμα είναι για php αλλά δεν μπόρεσα να το "μεταφέρω". Αν θέλει κάποιος από τους admin ας το κάνει.

Άβαταρ μέλους
korgr
Honorary Member
Δημοσιεύσεις: 5067
Εγγραφή: 07 Οκτ 2008 18:30
Τοποθεσία: Corinth
Επικοινωνία:

Πρόβλημα με εισαγωγή date από csv

Δημοσίευση από korgr » 02 Οκτ 2010 14:26

Απορία:
Αφού έχεις έτοιμο το αρχείο και σε shell δουλευει, γιατί δεν χρησιμοποιείς την LOAD DATA INFILE και μέσα στο php αρχείο σου?

Apostolis_38
Δημοσιεύσεις: 1969
Εγγραφή: 14 Φεβ 2008 16:20
Τοποθεσία: ΠΕΙΡΑΙΑΣ

Πρόβλημα με εισαγωγή date από csv

Δημοσίευση από Apostolis_38 » 02 Οκτ 2010 15:34

Ακόμα κι από mysql shell για να τρέξει το LOAD DATA INFILE πρέπει να είσαι root.
Αλλιώς έχεις access denied.

Γενικώς αποφεύγω να δίνω τέτοια δικαιώματα στα script αλλά μου φαίνεται πως τώρα δεν γίνεται αλλιώς.


Ελεγα μήπως με κάποιο τρόπο στο implode μπορέσω να "δηλώσω" οτι κάποια συγκεκριμένα data είναι σε date format, αλλά μάλλον είναι μεγαλύτερη ταρζανιά να κάνεις κάτι τέτοιο.
Αν γίνεται...

Άβαταρ μέλους
fafos
Script Master
Δημοσιεύσεις: 6231
Εγγραφή: 30 Νοέμ 2004 03:09

Πρόβλημα με εισαγωγή date από csv

Δημοσίευση από fafos » 02 Οκτ 2010 16:28

einai polla ta date pedia? einai se statherh thesh h dinontai analoga thn eggrafh? an gnorizeis thn thesh giati den pairnei to pedio meta thn explode kai na to metatrepseis? gia paradeigma an einai sthn 5h thesh to pedio einai $arr[4] opote tou kaneis mia metatroph se English time kai teleioses..
Οι πάνες και οι πολιτικοί πρέπει να αλλάζονται συχνά για τον ίδιο λόγο...

Άβαταρ μέλους
burnmind
Script Master
Δημοσιεύσεις: 954
Εγγραφή: 26 Σεπ 2009 02:14
Τοποθεσία: UK
Επικοινωνία:

Πρόβλημα με εισαγωγή date από csv

Δημοσίευση από burnmind » 02 Οκτ 2010 16:53

Αν δε γίνεται αυτό που λέει ο fafos, το μόνο που μπορώ να σκεφτώ είναι μια λύση του στυλ:

Κώδικας: Επιλογή όλων

$line = 'test,18/05/2010,test,test,30/10/2030,test';
$newline = preg_replace&#40;'/&#40;\d&#123;2&#125;&#41;\/&#40;\d&#123;2&#125;&#41;\/&#40;\d&#123;4&#125;&#41;/', '$3-$2-$1', $line&#41;;
echo $newline
στον κώδικά σου:

Κώδικας: Επιλογή όλων

for&#40;$i = 0; $i < sizeof&#40;$contents&#41;; $i++&#41; &#123; 
$line = trim&#40;$contents&#91;$i&#93;&#41;; 
$newline = preg_replace&#40;'/&#40;\d&#123;2&#125;&#41;\/&#40;\d&#123;2&#125;&#41;\/&#40;\d&#123;4&#125;&#41;/', '$3-$2-$1', $line&#41;;
$arr = explode&#40;",",$newline&#41;;

Άβαταρ μέλους
fafos
Script Master
Δημοσιεύσεις: 6231
Εγγραφή: 30 Νοέμ 2004 03:09

Πρόβλημα με εισαγωγή date από csv

Δημοσίευση από fafos » 02 Οκτ 2010 17:14

burNMind έγραψε:Αν δε γίνεται αυτό που λέει ο fafos, το μόνο που μπορώ να σκεφτώ είναι μια λύση του στυλ:

Κώδικας: Επιλογή όλων

$line = 'test,18/05/2010,test,test,30/10/2030,test';
$newline = preg_replace&#40;'/&#40;\d&#123;2&#125;&#41;\/&#40;\d&#123;2&#125;&#41;\/&#40;\d&#123;4&#125;&#41;/', '$3-$2-$1', $line&#41;;
echo $newline
στον κώδικά σου:

Κώδικας: Επιλογή όλων

for&#40;$i = 0; $i < sizeof&#40;$contents&#41;; $i++&#41; &#123; 
$line = trim&#40;$contents&#91;$i&#93;&#41;; 
$newline = preg_replace&#40;'/&#40;\d&#123;2&#125;&#41;\/&#40;\d&#123;2&#125;&#41;\/&#40;\d&#123;4&#125;&#41;/', '$3-$2-$1', $line&#41;;
$arr = explode&#40;",",$newline&#41;;
auth einai kalyterh idea apo thn dikh mou giati den tha xreiastei na peirakseis to query..
Οι πάνες και οι πολιτικοί πρέπει να αλλάζονται συχνά για τον ίδιο λόγο...

Apostolis_38
Δημοσιεύσεις: 1969
Εγγραφή: 14 Φεβ 2008 16:20
Τοποθεσία: ΠΕΙΡΑΙΑΣ

Πρόβλημα με εισαγωγή date από csv

Δημοσίευση από Apostolis_38 » 02 Οκτ 2010 17:50

@burNMind: θα το δοκιμάσω.

@fafos: δυστυχώς ούτε το πλήθος των πεδίων είναι σταθερό, ούτε η σειρά.
Ο χρήστης θα μπορεί να κάνει εισαγωγή στοιχείων σε οποιοδήποτε πίνακα θέλει.

Apostolis_38
Δημοσιεύσεις: 1969
Εγγραφή: 14 Φεβ 2008 16:20
Τοποθεσία: ΠΕΙΡΑΙΑΣ

Πρόβλημα με εισαγωγή date από csv

Δημοσίευση από Apostolis_38 » 02 Οκτ 2010 18:21

φίλε burNMind, όχι

Το πρόβλημα είναι στο implode.
Φαντάζομαι πως μετατρέπει το - της ημερομηνίας (2010-01-01) σε , (2010,01,01) οπότε το date format πάει περίπατο.
Το περίεργο βέβαια είναι οτι παρ' όλα αυτά δεν χαλάει η σειρά των πεδίων και δεν χάνονται δεδομένα.

Δεν πειράζει, θα δώσω στο συγκεκριμένο script root access και θα περνάει με LOAD DATA.


Ευχαριστώ πολύ όλους.

Απάντηση

Επιστροφή στο “MySQL”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες