Avatar billede buch78 Novice
16. oktober 2003 - 19:25 Der er 34 kommentarer og
2 løsninger

læse ting ind i mysql fra en tekstfil

Er der en herind der lige har en overskulig løsning til hvordan man læser ting ind fra en tekst fil.. den fil jeg gerne vil læse ind fra er.. fra nero infotool

1.txt
Nero InfoTool 2.00



Hardware Information
--------------------
CPU                  :    1200 MHz
Bus Speed            :  66 MHz
Motherboard          :  ECS 7S5A                         
System              :  ECS 7S5A                         
BIOS                :  AMI 7.00T                         
Memory              :  256 MB
Sound                : C-Media Wave Device
Video                : NVIDIA Vanta
Avatar billede martinbk Nybegynder
16. oktober 2003 - 19:43 #1
$file = fopen("1.txt");
$nvalue = array();
for ($i=2;$i<count($file);$i++) {
  list($enhed, $value) = explode(":", $file[$i];
  array_push($nvalue, $value);
}
$query = "INSERT INTO tabel (CPU, Bus, Mb, System, BOIS, Mem, Sound, Video) VALUES ('$nvalue[0]', '$nvalue[1]', $nvalue[2]', '$nvalue[3]', '$nvalue[4]', '$nvalue[5]', '$nvalue[6]', '$nvalue[7]')";
if (mysql_query($query)) {
  echo "data indsat";
}
else {
  echo "fejl";
}

ovenstående er IKKE testet
Avatar billede martinbk Nybegynder
16. oktober 2003 - 19:44 #2
har allerede fundet første fejl.

1. linie skal være:
$file = file("1.txt");
Avatar billede martinbk Nybegynder
16. oktober 2003 - 19:49 #3
$file = file("1.txt");
$nvalue = array();
for ($i=2;$i<count($file);$i++) {
  list($enhed, $value) = explode(":", $file[$i]);
  $value = trim($value);
  array_push($nvalue, $value);
}
$query = "INSERT INTO tabel (CPU, Bus, Mb, System, BOIS, Mem, Sound, Video) VALUES ('$nvalue[0]', '$nvalue[1]', $nvalue[2]', '$nvalue[3]', '$nvalue[4]', '$nvalue[5]', '$nvalue[6]', '$nvalue[7]')";
if (mysql_query($query)) {
  echo "data indsat";
}
else {
  echo "fejl";
}


vi prøver lige igen :)
Avatar billede detox Nybegynder
16. oktober 2003 - 19:51 #4
Mit forslag:

$lines = file('1.txt');
foreach ($lines as $line) {
    if (strpos($line, ":")) {
        list($key[], $val[]) = explode(":", $line);
    }
}
$keys = implode(", ", $key);
$values = implode("', '", $val);
$qstr = "INSERT INTO tabel_navn ($keys) VALUES ('$values')";
mysql_query($qstr) or die(mysql_error());
Avatar billede buch78 Novice
16. oktober 2003 - 20:09 #5
Tak for de hurtige svar.. jeg kigger lige på dem og vender tilbage
Avatar billede buch78 Novice
16. oktober 2003 - 20:27 #6
Jeg har prøvet den nederste af ( detox ) den virker kun hvis jeg fjerner speed fra Bus Speed.. er der nogen måde man kan komme ud over det mellem rum
Avatar billede buch78 Novice
16. oktober 2003 - 20:32 #7
holybull din sidete script melder bare fejl. når jeg køre det..
Avatar billede martinbk Nybegynder
16. oktober 2003 - 20:33 #8
prøv og ændre strpos til strstr
Avatar billede martinbk Nybegynder
16. oktober 2003 - 20:33 #9
buc
Avatar billede martinbk Nybegynder
16. oktober 2003 - 20:33 #10
argh sry sidste var en fejl, men hvilken fejl melder min da ?
Avatar billede buch78 Novice
16. oktober 2003 - 20:37 #11
Bare fejl..

min kode er her.. jeg har dog ændret nogle ting. for så passede med med den anden jeg prøvede..
    <?
$host = "127.0.0.1";           
$user = "root";               
$password = "***";                             
$dbname = "tabel";                           
$conn = mysql_connect($host, $user, $password);       
mysql_select_db($dbname, $conn);                   
?>
<?
$file = file("1.txt");
$nvalue = array();
for ($i=2;$i<count($file);$i++) {
  list($enhed, $value) = explode(":", $file[$i]);
  $value = trim($value);
  array_push($nvalue, $value);
}
$query = "INSERT INTO tablename (CPU , Bus , Motherboard , System , BIOS , Memory , Sound , Video) VALUES ('$nvalue[0]', '$nvalue[1]', $nvalue[2]', '$nvalue[3]', '$nvalue[4]', '$nvalue[5]', '$nvalue[6]', '$nvalue[7]')";
if (mysql_query($query)) {
  echo "data indsat";
}
else {
  echo "fejl";
}
?>
Avatar billede detox Nybegynder
16. oktober 2003 - 20:37 #12
Ja, jeg måtte sande værdien af trim(). Dette fungerer:

$lines = file('1.txt');
foreach ($lines as $line) {
    if (strpos($line, ":")) {
        list($k, $v) = explode(":", $line);
        $key[] = trim($k);
        $val[] = trim($v);
    }
}
$keys = implode("`,`", $key);
$values = implode("', '", $val);
$qstr = "INSERT INTO pc (`$keys`) VALUES ('$values')";
mysql_query($qstr) or die(mysql_error());
Avatar billede buch78 Novice
16. oktober 2003 - 20:38 #13
mine tabeller.
CREATE TABLE `tablename` (
  `CPU` varchar(255) default NULL,
  `Bus` varchar(255) default NULL,
  `Motherboard` varchar(255) default NULL,
  `System` varchar(255) default NULL,
  `BIOS` varchar(255) default NULL,
  `Memory` varchar(255) default NULL,
  `Sound` varchar(255) default NULL,
  `Video` varchar(255) default NULL
) TYPE=MyISAM;
Avatar billede detox Nybegynder
16. oktober 2003 - 20:39 #14
Og ved brug af 'backtics' virker den nu osse med 'Bus Speed'
Avatar billede buch78 Novice
16. oktober 2003 - 20:44 #15
Ja.. de kan jeg se.. hvis man nu har mange txt filer der skal ind og den eneste forskel er fil navnet ( 1.txt 2.txt OSV ) hvordan kan man så få den til at tage dem automatisk.. det gør ingen ting at der skal lavet et feldt der hedder ID i mysql
Avatar billede martinbk Nybegynder
16. oktober 2003 - 20:51 #16
function txttilsql($file) {
$lines = file($file);
foreach ($lines as $line) {
    if (strpos($line, ":")) {
        list($k, $v) = explode(":", $line);
        $key[] = trim($k);
        $val[] = trim($v);
    }
}
$keys = implode("`,`", $key);
$values = implode("', '", $val);
$qstr = "INSERT INTO pc (`$keys`) VALUES ('$values')";
mysql_query($qstr) or die(mysql_error());
}

så kalder du blot funktionen
txttilsql("1.txt");
txttilsql("2.txt");
etc
du kan også gøre sådan her


$dir = opendir($dir);
while (($file = readdir($dir))!==false) {
  if ($file != ".." && $file != ".")
      txttilsql($file);
  }
}
Avatar billede detox Nybegynder
16. oktober 2003 - 20:52 #17
Fx, med et id-felt 'ID':

$antal_filer = 3;
for ($i=1;$i<=$antal_filer;$i++) {
$filnavn = $i.".txt";
$lines = file($filnavn);
foreach ($lines as $line) {
    if (strpos($line, ":")) {
        list($k, $v) = explode(":", $line);
        $key[] = trim($k);
        $val[] = trim($v);
    }
}
$keys = implode("`,`", $key);
$values = implode("', '", $val);
$qstr = "INSERT INTO pc (ID, `$keys`) VALUES ($i, '$values')";
mysql_query($qstr) or die(mysql_error());
}
Avatar billede martinbk Nybegynder
16. oktober 2003 - 20:55 #18
jeg vil give detox halv ret, blot ville jeg bruge et auto-increment felt og så skrive tekst -> sql som en funktion og bruge readdir
Avatar billede detox Nybegynder
16. oktober 2003 - 20:56 #19
Tabellen jeg har testet på:

CREATE TABLE `pc` (
  `ID` smallint(6) unsigned NOT NULL default '0',
  `CPU` varchar(255) default NULL,
  `Bus Speed` varchar(255) default NULL,
  `Motherboard` varchar(255) default NULL,
  `System` varchar(255) default NULL,
  `BIOS` varchar(255) default NULL,
  `Memory` varchar(255) default NULL,
  `Sound` varchar(255) default NULL,
  `Video` varchar(255) default NULL
) TYPE=MyISAM
Avatar billede martinbk Nybegynder
16. oktober 2003 - 20:58 #20
min begrundelse for valget af readdir, buch har jo ikke fastlagt at filerne hedder 1.txt 2.txt etc.
Avatar billede detox Nybegynder
16. oktober 2003 - 20:58 #21
citat: 'og den eneste forskel er fil navnet ( 1.txt 2.txt OSV )'
Avatar billede martinbk Nybegynder
16. oktober 2003 - 20:59 #22
sry detox nok bare mig der sover.. men stadig synes jeg løsningen med readdir er bedst fordi du ikke skal ind og sætte antallet af filer
Avatar billede martinbk Nybegynder
16. oktober 2003 - 21:01 #23
kommer self. igen an på hvad scriptet skal bruges til, hvis det blot er for at sætte nogle tekstfiler i en database er din løsning jo fin, jeg tænkte nok mere i baner hvis det skal bruges lidt mere dynamisk
Avatar billede detox Nybegynder
16. oktober 2003 - 21:01 #24
holybull -> Men det forhindrer selvfølgelig ikke, at man ikke kan lave det mere flexibelt og måske mere anvendeligt i andre sammenhæng. Fx ved brug af funktioner som du foreslår. Lidt finpudsning er jo aldrig af vejen.
Avatar billede detox Nybegynder
16. oktober 2003 - 21:36 #25
Her er et forsøg på noget af det holybull foreslår, med et autoincreament id felt og en funktion der finder filerne i en mappe. Det gør det da unægteligt mere flexibelt/dynamisk.:

<?
require 'connect.inc.php';
$dir = 'test_mappe';

$filer = getfiles($dir);

foreach ($filer as $fil) {
    $lines = file($fil);
    $key = array();
    $val = array();
    foreach ($lines as $line) {
        if (strpos($line, ":")) {
            list($k, $v) = explode(":", $line);
            $key[] = trim($k);
            $val[] = trim($v);
        }
    }
    $keys = implode("`,`", $key);
    $values = implode("', '", $val);
    $qstr = "INSERT INTO pc (`$keys`) VALUES ('$values')";
    mysql_query($qstr) or die(mysql_error());
    echo $qstr."<br /><br />";
}

//Funktion der henter filnavnene fra $dirName
function getfiles ($dirName) {
$d = dir($dirName);
while($entry = $d->read()) {
    if (!is_dir($entry)) {
        $file[] = $dirName."/".$entry;
    }
}
$d->close();
return $file;
}//END Function
?>
Avatar billede buch78 Novice
16. oktober 2003 - 21:56 #26
nu begynder det sku at ligne noget... men mysql brokker sig over at der står det samme i Motherboard & System
Avatar billede buch78 Novice
16. oktober 2003 - 21:58 #27
Jeg Har godt nok ikke sat ID til autoincreament.. da jeg godt kunne tænke mig at filnavnet skal stå her..
Avatar billede buch78 Novice
16. oktober 2003 - 22:02 #28
Bare glem det med at ysql brokker sig... det gør den nemmelig ikke mere når ID bliver autoincreament
Avatar billede detox Nybegynder
16. oktober 2003 - 22:06 #29
Ok, men det med filnavnet er jo en god idé: Fx sådan her:

CREATE TABLE `pc` (
  `ID` smallint(6) unsigned NOT NULL auto_increment,
  `filnavn` varchar(255) default NULL,
  `CPU` varchar(255) default NULL,
  `Bus Speed` varchar(255) default NULL,
  `Motherboard` varchar(255) default NULL,
  `System` varchar(255) default NULL,
  `BIOS` varchar(255) default NULL,
  `Memory` varchar(255) default NULL,
  `Sound` varchar(255) default NULL,
  `Video` varchar(255) default NULL,
  PRIMARY KEY  (`ID`)
) TYPE=MyISAM

<?
require 'connect.inc.php';
$dir = 'test_mappe';

$filer = getfiles($dir);

foreach ($filer as $fil) {
    $sti = $dir."/".$fil;
    $lines = file($sti);
    $key = array();
    $val = array();
    foreach ($lines as $line) {
        if (strpos($line, ":")) {
            list($k, $v) = explode(":", $line);
            $key[] = trim($k);
            $val[] = trim($v);
        }
    }
    $keys = implode("`,`", $key);
    $values = implode("', '", $val);
    $qstr = "INSERT INTO pc (`filnavn`, `$keys`) VALUES ('$fil', '$values')";
    mysql_query($qstr) or die(mysql_error());
    echo $qstr."<br /><br />";
}

//Funktion der henter filnavnene fra $dirName
function getfiles ($dirName) {
$d = dir($dirName);
while($entry = $d->read()) {
    if (!is_dir($entry)) {
        $file[] = $entry;
    }
}
$d->close();
return $file;
}//END Function
?>
Avatar billede buch78 Novice
16. oktober 2003 - 22:10 #30
er filnavn en kendt funktion... jeg kan ikke se hvor den får den fra
Avatar billede detox Nybegynder
16. oktober 2003 - 22:14 #31
Næ, filnavnene finder den i funktionen getfiles()
Avatar billede detox Nybegynder
16. oktober 2003 - 22:16 #32
Kunne osse gøres sådan (måske mere overskueligt):

<?
require 'connect.inc.php';
$dir = 'test_mappe';
$filer = getfiles($dir);
foreach ($filer as $fil) {
    $sti = $dir."/".$fil;
    $lines = file($sti);
    $key = array('filnavn');
    $val = array($fil);
    foreach ($lines as $line) {
        if (strpos($line, ":")) {
            list($k, $v) = explode(":", $line);
            $key[] = trim($k);
            $val[] = trim($v);
        }
    }
    $keys = implode("`,`", $key);
    $values = implode("', '", $val);
    $qstr = "INSERT INTO pc (`$keys`) VALUES ('$values')";
    mysql_query($qstr) or die(mysql_error());
    echo $qstr."<br /><br />";
}
//Funktion der henter filnavnene fra $dirName
function getfiles ($dirName) {
$d = dir($dirName);
while($entry = $d->read()) {
    if (!is_dir($entry)) {
        $file[] = $entry;
    }
}
$d->close();
return $file;
}//END Function
?>
Avatar billede buch78 Novice
16. oktober 2003 - 22:17 #33
ok det vil jeg så lige læse lidt om... gidder du ikke smide et svar detox
Avatar billede detox Nybegynder
16. oktober 2003 - 22:21 #34
echo $qstr."<br /><br />";
kunne ændres til (lidt mere sigende):
  echo $fil." er indsat i databasen<br />";
Avatar billede martinbk Nybegynder
20. oktober 2003 - 21:14 #35
ved at være lukketid her omkring ? :-)
Avatar billede buch78 Novice
20. oktober 2003 - 21:18 #36
så lad da gå
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