Gå til innhold

flatfil --> mySQL


Anbefalte innlegg

Jupp, jeg har spurt om nesten det samme før..

 

Dersom jeg har en txt-fil som ser slik ut:

|navn|poeng|cru|

 

..så vil jeg gjøre dette om til en mysql tabel.

row1 = navn, row2 = poeng osv..

Tipper jeg må bruke LOAD opplegget, men jeg føler meg veldig blond uten å faktisk være blond :-p

 

Er det noen som har noen minutter til å komme med et forslag på hvordan jeg gjør det?

Lenke til kommentar
Videoannonse
Annonse

oki...

 

*) åpne fila   

fopen/readfile ++ (ikke noe problem tror jeg)

 

*) while løkke over hver linje

? Må jeg ha dette for hver linje i txt-filen? Da blir det jo stress når det kommer flere linjer i txt-filen. eller?

 

..*) split fila i 3 felter 

her lurer jeg på hva jeg skal gjøre....

 

..*) sett inn de 3 verdiene 

Skal gå greit vist jeg får til det andre :-p

Lenke til kommentar
*) while løkke over hver linje

  ? Må jeg ha dette for hver linje i txt-filen? Da blir det jo stress når det kommer flere linjer i txt-filen. eller?

 

Skal du ikke ha alle linjene inn i databasen da?

 

..*) split fila i 3 felter 

her lurer jeg på hva jeg skal gjøre....

 

søke i phpmanualen!

 

jeg ser for meg at du har data under hverandre i en fil, dvs flere rader?

 

EDIT: quote dritt.

Endret av Torbjørn
Lenke til kommentar

For å si det slik....

 

Her ser du eksempel på hvordan det ser ut i txt-filen:

 

Ole|2|45|91234

Per|43|0|123

Kari|0|0|21

 

Dette skal da inn i tabel slik:

 

navn | poeng1 | poeng2 | poeng3
Ole   | 2          | 45        | 91234
Per   | 43        | 0          | 123
Kari  | 0          | 0          | 21

Lenke til kommentar

Sa vel egentlig ikke at jeg ikke ville ha det..

..var nok dorlig formulert fra min side.

 

Så, da såørr jeg slik:

 

Hvordan virker dette?

Må jeg manuelt sette inn while løkke for hver linje, eller går dette automatisk?

Saken er at det heletiden vil komme flere linjer inn i txt-filen, og databasen skal opdateres en gang per dag.

Dersom jeg må skrive inn while løkke for hver nye linje, så blir det jo mye arbeid hver dag.

 

 

 

 

EDIT: regner med du søkte manualen etter split

Dette kan jeg ingenting om.

Nå vet jeg at jeg kan søke etter split i manualen siden du sa det, men jeg hadde ikke peiling på det tidligere :-p

 

 

Jeg er en evig n00b i php :whistle:

Lenke til kommentar
Sa vel egentlig ikke at jeg ikke ville ha det..

..var nok dorlig formulert fra min side.

 

Så, da såørr jeg slik:

 

Hvordan virker dette?

Må jeg manuelt sette inn while løkke for hver linje, eller går dette automatisk?

Du setter opp en løkke som leser inn en ny linje fra filen og så behandler denne, eller avbrytes når du er kommet til slutten på fila.

 

Saken er at det heletiden vil komme flere linjer inn i txt-filen, og databasen skal opdateres en gang per dag.

Umm.. Hvor kommer denne tekstfilen fra? Når du først går over til å bruke en database så kunne det kanskje være en idé å legge til nye poster direkte i denne.

Eller du må komme opp med en løsning som hindrer deg i å kopiere samme linje til databasen flere ganger.

 

Lykke til.

Lenke til kommentar
Umm.. Hvor kommer denne tekstfilen fra? Når du først går over til å bruke en database så kunne det kanskje være en idé å legge til nye poster direkte i denne.

Eller du må komme opp med en løsning som hindrer deg i å kopiere samme linje til databasen flere ganger.

 

Lykke til.

Jo, saken er at jeg spiller et MMORPG spill som heter Anarchy Olnine.

I dette spille er jeg med i en Clan, og vi har en bot som vi bruker til å legge inn divers informasjon. Han som sitter med boten klarer ikke å legge informasjonen ut på andre måter, og jeg skal da hente denne informasjonen fra ham, og legge det inn i database så vi får det på websiden vår i tilleg til på boten.

Lenke til kommentar
Etter mye surfing på nette fant jeg dette:

load data infile '/tmp/mytest.txt' into table thetbl fields terminated by ',' enclosed by '"' lines terminated by '\r\n';

 

Kan dette brukse?

Eksempel på load funksjonen har jo veldig nylig vært nevnt her i forumet til og med.

Men, du må nok skrive om load funksjonen til å bruke det du bruker i filen:

 

load data infile '/tmp/mytest.txt' into table thetbl fields terminated by '|' lines terminated by '\r\n';

 

Det er lov å se over det man finner på nettet og prøve å forstå det selv da :)

Lenke til kommentar

Noe sant?

 

 

<?

 

//database snakk

 

mysql_connect('localhost', 'usr', 'psw');

mysql_select_db('the_db');

 

 

//Foreach loop for hver linje i fila: (manualens eksempel)

 

$lines = file ('flatfila.txt');

 

foreach ($lines as $line_num => $line) {

    $string = htmlspecialchars($line)

 

list($navn, $poeng1, $poeng2osv) = split('|', $string);

 

$query = "INSERT INTO `tabbel_navn` ('id', 'navn', 'poeng1', 'poeng2')

VALUES ('', $navn, $poeng1, $poeng2 osv);

 

mysql_query($query);

 

 

 

}

 

?>

 

Du bør ha en id kollone med AUTO_INCREMENT.

Endret av robgar
Lenke til kommentar

Dette lille scriptet gjør nettop det du ber om. Henter data fra filen /home/xxxx/textfile_tabellnavn.txt

 

 

#!/usr/bin/perl

 

use DBI;

 

$REMOTE{db_name}='DBI:mysql:database=xxxx;host=xxxx;

$REMOTE{db_user}='xxxx';

$REMOTE{db_pass}='xxxx';

 

@tables=('xxxx'); #add more to this array if necessary

 

$input_prefix="/home/xxxx/textfile_";

 

#you don't need to set up anything below

 

sub output_error

{

my ($where)=@_;

print qq|Content-type: text/html\n\n

<h2>Error encountered</h2>

<p>$where

<p>Execution stopped

|;

$dbh1->disconnect() if $dbh1;

$dbh2->disconnect() if $dbh2;

exit();

}

 

sub output_ok

{

print qq|Content-type: text/html\n\n

<h2>Import OK</h2>

<p>$messages

<p>$count rows were copied

<p>Execution ended

|;

}

 

$dbh1=DBI->connect($REMOTE{db_name},$REMOTE{db_user},$REMOTE{db_pass}) or &output_error('Error connecting to the database');

 

$count=0;

$messages="";

 

foreach $table (@tables)

{

unless (open(INP,"${input_prefix}$table.txt"))

{

$messages.="File ${input_prefix}_$table.txt cannot be found<p>";

next;

}

 

$dbh1->do("delete from $table"); #comment this line if you do not want to wipe the tables each time;

 

@colxp=();

$datacnt=$dbh1->selectall_arrayref("describe $table");

$datacnt=scalar(@$datacnt);

for ($i=0;$i<$datacnt;$i++)

{

push @colxp,'?';

}

$sth1=$dbh1->prepare("insert into $table values (".join(',',@colxp).")");

while (<INP>)

{

s/[\r\n]+$//;

@data=split(/\|/);

splice @data,$datacnt;

while (scalar @data<$datacnt)

{

push @data,'';

}

$sth1->execute(@data);

$count++;

}

$sth1->finish();

}

$dbh1->disconnect();

 

&output_ok();

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...