Avatar billede erik_a Novice
01. april 2009 - 10:36 Der er 3 kommentarer og
1 løsning

Læse csv og indsættelse i DB

Hejsa folkens.

Jeg ligger inde med en csv-fil med ca 13000 linjer.
Jeg har importeret denne i en mysql database, men fandt fejl under denne importering, og efter bedste evne gætter jeg mig til at det skyldes et linjeskift, men er ret sikker på der ligger lidt mere i den end det, for jeg kan ikke fjerne denne.

En af de linjer der fejler :

"Mare";"-";"";"";"C:\Documents and Settings\alwj\Dokumenter\welshdata\D\LasgrugFfay.jpg";"WD 0129";"84246";"Lasgrug Ffay";"D";"1.kl.";"brun";"148";"Clydogau Cleopatra";"Menai Sparkling Comet";"100";"1997
Excellent type. God kropsdybde. Kønt hoved, men lidt små øjne. Stejl skulder. Særdeles god overlinie. Særdeles god bagpart med velansat hale. Forlemmerne har for umarkerede led, og er indknebne under forknæ. Uklare haser og kodeled bag. God bevægelse.

2000 1.kl.
Hoppe af excellent type og med god dybde. Typisk welsh hoved med udtryksfulde øjne. God forpart med velrejst hals. Særdeles god overlinie, muskuløs bagpart. Gode lemmer. God bevægelse.";"20,5";"-";"-"

Fejlen forekommer ved hvert linjeskift som også kan ses i ovenstående.

Har prøvet at fjerne med en funktion :
function str_encase($text, $prefix = '', $affix = '')
{
    // Handle line endings correctly
    $str = preg_replace('#(\r\n?|\n)#s', $affix . '\1' . $prefix, $text);

    // Finish string
    return $prefix . $str . $affix;
}
funktionskaldet : $d[$s] =  str_encase($d[$s], null, '');

Endvidere har jeg også prøvet med : $d[$s] = str_replace("\n\r", "", $d[$s]);

Begge uden det ønskede resultat.

Nogen der har guldkornene?
Hvis det ønskes kan jeg selvfølgelig smide en mindre del af csvfilen i offentlig skue.

På forhånd tak...
/Erik_A
Avatar billede olebole Juniormester
01. april 2009 - 11:14 #1
<ole>

Hvad bruger du til at læse filen med? Har du prøvet PHP's native funktioner - f.eks:
    http://dk2.php.net/manual/en/function.fgetcsv.php

/mvh
</bole>
Avatar billede erikjacobsen Ekspert
01. april 2009 - 11:22 #2
Og problemet er helt sikkert linieskift. Hvordan afgør du på hvilken linie, den næste record begynder.

Jeg vil sige csv filen er uanvendelig i dens nuværende form, og at du skal have den igennem en manuel efterbehandling: notepad, og så fjerner du selv linieskift.
Avatar billede erik_a Novice
01. april 2009 - 11:27 #3
Smider lige lidt af min kode ind :

$filnavn = "sample_erik2.csv";
echo "<b>" . $filnavn . "</b><br><br>";

$handle = file($filnavn);


$i=0; // Starter Counter/Linjenummer med 0
$ok=0; // Antal korrekte indsættelser.
$update=0; // Antal korrekte indsættelser.
$fejl=0; // Antal forkerte indsættelser.
$m = 0;
//foreach ($i<count($handle)){
while($i<count($handle)){

  $content = explode(";",$handle[$i]);

  $s=0;
 

  while ($s != 19){
    $d[$s]= trim($content[$s]);
   
    $d[$s] =  str_encase($d[$s], null, '');
               
    // Fjerner ""
    $d[$s] = str_replace('"', "", $d[$s]);
       
    $d[$s]= addslashes($d[$s]);
       
    if($d[$s] == '-' || $d[$s] == ' -' || $d[$s] == '- ')
    {
        $d[$s] = '';
    }
       
    $d[$s] = strip_tags($d[$s]);

        // Sørger får den går til næste felt!
    $s++;
};
Avatar billede erik_a Novice
08. april 2009 - 12:56 #4
Har fået rettet hele databasen til så der ikke længere eksisterer linjeskift. Var åbenbart den eneste måde at rette dette på.

/Erik
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester