Gå til innhold

flatfil --> mySQL


Anbefalte innlegg

Skrevet

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?

Videoannonse
Annonse
Skrevet

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

Skrevet (endret)
*) 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
Skrevet

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

Skrevet (endret)

mao du har flere linjer i din fil, hvorfor vil du da ikke kjøre løkka over alle linjer?

 

EDIT: regner med du søkte manualen etter split

Endret av Torbjørn
Skrevet

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:

Skrevet
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.

Skrevet
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.

Skrevet

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?

Skrevet
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 :)

Skrevet

Ja klart det er lov til å prøve å forstå det selv :-p

terminated by '|' tok jeg som en selvfølge.. men enclosed by vist jeg ikke.

 

/me opens notepad to do some testing.

Skrevet (endret)

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
Skrevet (endret)

Merkelig.. Har du plassert {}- tegnene på riktig plass slik at hele kodesekveksnen (etter foreach) utføres for hver linje?

 

edit: trykkfeil

Endret av oro2
Skrevet
Warning: split(): REG_EMPTY in /home/housemaa/public_html/aog/lc/db_test.php on line 21

 

split('|', $string); virker ikke. Liker vist ikke |.

Tenkte jeg bare skulle si det.

Skrevet

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();

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...