Autor Zpráva
gardener
Profil
Zdravim,
Chtel bych se zeptat, zda nekdo netusi, jak by se dalo pri pouziti fce LOAD DATA IN FILE udelat to abych ve zdrojovem CSV. souboru vybral jenom urcite sloupce?

Diky za kazdou radu..
tiso
Profil
gardener - nijak...
Môžeš vytvoriť tabuľku s rovnakým počtom stĺpcov ako má csv, a po importe zrušiť nepotrebné stĺpce, takže zostanú len tie čo potrebuješ...
Druhá možnosť je load do temp tabuľky a následné skopírovanie len toho čo potrebuješ do cieľovej tabuľky.
http
Profil
a co udělat regularni výraz na ty středníky?

např:

pole1;pole2;pole3;pole4
pole1;pole2;pole3;pole4
pole1;pole2;pole3;pole4
pole1;pole2;pole3;pole4

postup
cyklus fread -> reg. výraz "na najdi obsah od druhého ; do třetího ;" -> načti do proměnné -> nový řádek ->
end

takhle bych si to asi logicky představoval, ovšem za předpokladu že víš jaký sloupec načíst... a taky jestli ti tu někdo napíše na tohle reg výraz, což by neměl být problém
TomášK
Profil
LOAD DATA INFILE 'file.txt'
  INTO TABLE t1
  (column1, @dummy, column2, @dummy, column3);
gardener
Profil
Díky za info, zkusím regulár a nebo popřípadě do tempu a pak smažu nepotřebné sloupce..

TomášK
123 LOAD DATA INFILE 'file.txt'  INTO TABLE t1  (column1, @dummy, column2, @dummy, column3);

To znamená, že bych mohl přímo určit jaký sloupec ze zdroje nahrát? To jsem hledam v MySQL manuálu ale nikde jsem to tam nenašel..
TomášK
Profil
gardener
Přesně tak. Uvedený dotaz nahraje do tabulky t1 se sloupci column1, column2, column3 data z prvního, třetího a pátého sloupce CSV souboru. Zkopíroval jsem to přímo z dokumentace, http://dev.mysql.com/doc/refman/5.1/en/load-data.html.

Lze i data upravovat předtím, než je vložíš, je to popsané o kousek vedle v té dokumentaci (hodí se to třeba na přeformátování datumů).
gardener
Profil
TomášK>
Tak jsem vyzkoušel nahrávvání pomocí výčtu sloupců v CSV ale bohužel mi to nefunguje
1)Zkoušel jsem jednak odstranit dolni vyjmenovane sloupce tabulky, tj.(jmeno,prijmeni,mobil)
2)Použít ENCLOSED BY '\" '
Ale nic z toho nepomohlo..tak si říkám, jestli na to nemůže mít vliv diakritika(velikost písmen asi ne..MySQL je nastaveno na CI)
ukázková dta vypadají takto:
"Jméno","Příjmení","Zaměstaní","Mobilní tel"
"Martin ","Šťastný","Kosmonaut",854962158


a kód starající se o upload do DB vypadá takto:


$soubor = mysql_real_escape_string(dirname(__FILE__) . '\\' . $soubor_nazev);
	$vlozeni = mysql_unbuffered_query ("LOAD DATA INFILE '".$soubor."' INTO TABLE kontakty
	(jmeno, @Jméno, prijmeni, @Příjmení, mobil, @Mobilní tel)
	FIELDS TERMINATED BY ',' 
    LINES TERMINATED BY '\r\n'
	(jmeno,prijmeni,mobil) 
	;"); 


Netuší někdo, kde by mohl být problém? Nebo co dělám špatně?

Díky za každou radu..
crook
Profil *
Hmm ja ted delam vyber a srovnani casti nazvu jobu avse delam pres retezce. Nactu do retezce, s tim podelam co chci, vyhodim vysledek. Nechces to taky nejak vzit pres retezce?
gardener
Profil
crook Přesně ti asi nerozumím..myslíš řetězec načíst a třeba pomocí explode ho rozdělit do pole a to pak foreachem procházet?
AM_
Profil
gardener

To se nedivím, že to nefunguje, když vidím diakritiku v dotazu (ikdyž názvech dummy sloupců, ale stejně), jde mi mráz po zádech.
crook
Profil *
to gardener: Presne tak a muzes si to nacist jak se ti to hodit. napr to tvoje: Ten prvni radek predpokladam nepotrebujes pac ho mas v tabulce.

if($_FILES['cesta']['type']=="application/octet-stream"){ // Pokud soubor bude mít kocovku .php, upload se neprovede a vypíše hlášku
       echo "Soubory s příponou PHP jsou zakázány!"; // Která je zde
            }
    if($_FILES['cesta']['type']== "" ){
        ?><h2 class="error">You dont select file</h2><?
       }
    else{
      
      
          $fd = fopen ($nazev_souboru, "r");
           while (!feof ($fd)) {
            ++$p;
              if( p!= '1'){             //vynechavam prvni radek
               $radek = fgets($fd, 4096);
              $slovo_all = explode(";",$radek);  //vemu si jen martina a telefon z radky "Martin ","Šťastný","Kosmonaut",854962158
               $jmeno = $slovo_all|[0];
               $tel = $slovo_all|[4];
               $vysledky[] = $jmeno.",".$tel; // ted mas uz jen pole co potrebujes takze: [0] => prvnijmeno,cislo,[1] => druhejmeno,cislo
             }
           }




Pak uz si to opet muzes zpracovat forechem nebo si rovnou ten retezec sestavis tak aby jsi jen hodil vysledek, nebo si to explodem zas rozdelis..tvorivosti se meze nekladou
crook
Profil *
Omlouvam se jeste by po nacteni melo prijit fclose ($fd);//uklid:)
crook
Profil *
to AM_...muzes mi rict kde by to melo mit problemy s diakritikopu? s tou se vubec nepracuje pokud mas zpravne kodovani v mysql
tiso
Profil
TomášK - tak toto som nepoznal
crook ???
AM_
Profil
Problém s diakritikou bych hledal tady: "LOAD DATA INFILE '".$soubor."' INTO TABLE kontakty
(jmeno, @Jméno, prijmeni, @Příjmení, mobil, @Mobilní tel)
Nejsem si 100% jistý, že je to zdroj problému, ale každopádně tam není jediný důvod ji používat a imho to nemusí být platný název sloupce, ikdyž dummy. Každopádně je to řekněme jednodušší řešení než to parsovat přes explode, škoda se ho hned vzdát když to hned napoprvé nejede...
crook
Profil *
tiso se pta:???
odpoved: ???????? -> to je na ten kod ci na neco jineho? Neco nelibi nefunguje ci co?

AM_
aha..no ja ten prvni radek predpokladal jako vynechavku..prece uz v tabulce ma nazvy sloupcu ne?..jinak mas pravdu..pokud to myslel jako nazvy sloupcu tak je to volovina..minimalnebych odstrnil tu diakritiku a osobne ani mezery v nazvech nepokladam za spravne. Kdyz uz tak tu mame "_"...no musim se radne podivat na LOAD DATA FILE..ja to jeste nepouzil..Nemam rad prime nacitani dat bez toho abych nekde videl mezivysledek ktery potvrdim.
tiso
Profil
crook - to je otázka: čo za somariny to píšeš?
AM_
Profil
Nemam rad prime nacitani dat bez toho abych nekde videl mezivysledek ktery potvrdim.
Pokud máš sloupce v databázi správně nastavené (typ sloupce, maximální délka atd.), není důvod to neimportovat přímo; obzvlášť pokud to slouží např jen k zálohování nebo přenosu z db do db a neočekáváš, že tam někdo bude připisovat nějaké blbosti, je to každopádně nejrychlejší řešení, protože se vyhneš tahání a parsování PHP skriptem
crook
Profil *
tiso: konketne by to neslo..ja poradne tvorim web tak rok az dva a rad se necham poucit, ale to co jsem napsal za kod je tezko somarina, kdyz to pouzivam a zrovna ted na podobne veci delam a bez problemu to funguje
tiso
Profil
crook - si si istý?
$slovo_all = explode(";",$radek);  //vemu si jen martina a telefon z radky "Martin ","Šťastný","Kosmonaut",854962158
AM_
Profil
crook
$jmeno = $slovo_all|[0];
Co tam dělá ten znak | před tím indexem? není to hloupost $slovo_all | [0] ? (| je bitové OR, ne?)
crook
Profil *
to tiso: Pardon bylo to vytazene z jineho prevodu a nevsim sem si ze ma jine csv..psal jsem to v rychlosti
ten znak vubec netusim..bylo to vytazene a u me ten znak neni, a stalo se to i druheho
crook
Profil *
to tiso: Pokud si vsimnes tak http psal o strednicich, proto jsem si toho ani nevsimal. On konkretne neuvedl csv jen ze je to csv a tam ja standartne pouzivam stredniky(verze v Excelu). To uz vic beru chybu to co napsal AM_ nez takovou blbost. A pokud sis jeste nevsim tak tam pridalc "" coz je pro me jen vypis hodnot a ne to co ma v CSV
gardener
Profil
Pravda, dikritiku z nadpisu sloupcu mohu odstranit před vložením..myslím si, že pokud je to app. pro osobní použití, tak bych si s parsováním dat přidělával zbytečně práci..dříve jsem používal jenom LOAD DATA INFILE, a byl jsem spokojen, ale teď se změnila struktura generovaného CSV a je v něm spousta sloupců, co prostě vkládat nepotřebuji..

Nicméně jsem příkaz upravil takto a zjistil jsem, že to funguje téměř jako klasický LDINF
resp. sloupce Jmeno,Prijmeni se vloží..Mobil nikoliv..netuším ale tedy proč..a v diakritice to teď být nemůže, jelikož ji odstraňuji.

    $soubor = mysql_real_escape_string(dirname(__FILE__) . '\\' . $soubor_nazev);
    //echo($soubor); Is here because i needed known absolute path for imported file
    //INTO TABLE t1  (column1, @dummy, column2, @dummy, column3);“
	$vlozeni = mysql_unbuffered_query ("LOAD DATA INFILE '".$soubor."' INTO TABLE kontakty
	FIELDS TERMINATED BY ',' 
	ENCLOSED BY '\"'
    LINES TERMINATED BY '\r\n'
	(jmeno, @Jmeno, prijmeni, @Prijmeni, mobil, @Mobil)
	;");  


EDIT:
Všiml jsem si, že SCALC mi sloupec mobil v CSV ukládá bez uvozovek tzn. takto:
"Jmeno","Prijmeni","Zamestnani","Mobil"
"Martin ","Šťastný","Kosmonaut",123456789
"Martin ","Šťastný","Kosmonaut",111222444


Ale ani pokud je tam doplním přímo, tak vkládání nefunguje..

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: