WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Programmierung (http://www.wcm.at/forum/forumdisplay.php?f=17)
-   -   Komplizierte Textdatei in MySQL umwandeln (http://www.wcm.at/forum/showthread.php?t=134615)

shusai 18.05.2004 14:58

Komplizierte Textdatei in MySQL umwandeln
 
Ich muss dringend eine Wörterbuchdatei in MySQL umwandeln, scheitere aber an der Unregelmäßigkeit der Datei.

Ich versuche einmal, die Deutsch-Englisch-Japanisch Datei zu beschreiben:
Am Zeilenbeginn steht ein dt. Ausdruck, dann ein Trennzeichen und kein bis mehrere engl. Ausdruck, die mit (E) beginnen, dann min. ein jap Ausdruck, der mit (J) beginnt, alles immer mit dem "|" getrennt:

aaaaa|(E)bbbbb|(E)ccccc|(J)xxxxx|(J)yyyyy

Vor einiger Zeit hatte ich mit folgendem Skript Erfolg, die Quelldatei war aber eindeutig getrennt:
PHP-Code:

<?php
set_time_limit
(7200);
mysql_connect("localhost""root""");
mysql_select_db("wadoku");
$quelle file ('./wadoku.txt');

  for(
$i=0$i<sizeof($quelle); $i++) {
      
$line trim($quelle[$i]);
      
$arr explode(";"$line);

      
$sql "insert into wadoku values ('".
                  
implode("','"$arr) ."')";
      
mysql_query($sql);
      echo 
$sql ."
\n"
;
      if(
mysql_error()) {
         echo 
mysql_error() ."
\n"
;
      }
}
?>

Idealerweise sollten drei Spalten entstehen, für jede Sprache eine, die auch mehrere Ausdrücke enthalten kann.
Wie kann man soetwas lösen? Explode alleine hilft ja nicht....

Danke für eure Hilfe!

eAnic 18.05.2004 15:09

Importiere die Datei doch im MS Excel und formatiere sie nach den Kriterien.

_m3 18.05.2004 15:10

Am Abend gibts ein Perl-Script dafür :D

shusai 18.05.2004 15:13

Zitat:

Original geschrieben von eAnic
Importiere die Datei doch im MS Excel und formatiere sie nach den Kriterien.
Wird ein bisserl aufwändig, habe vergessen zu sagen, dass die Datei nicht allzu klein ist, 21MB, 141.000 Zeilen...

@_m3:
Bin schon gespannt, danke!

_m3 18.05.2004 16:30

Wie schaut denn die DB aus?

shusai 18.05.2004 20:28

Ich dachte an eine ganz einfache Tabelle:

CREATE TABLE `tus` (
`dt` text NOT NULL,
`en` text NOT NULL,
`jp` text NOT NULL,
`np` text NOT NULL
) TYPE=MyISAM;

"np" ist zur Sicherheit, wenn etwas nicht eindeutig zugeordnet werden kann.

shusai 18.05.2004 21:48

Ich habe jetzt folgendes Skript:
PHP-Code:

<?php
 set_time_limit
(7200);
mysql_connect("localhost""root""");
mysql_select_db("tus");

$quelle=fopen("dic2.sjs","r");
  
 while(
$line=fgets($quelle)) {
$_sprache explode("|"$line);

$deutsch $_sprache[0];
unset (
$_sprache[0]);

$sql "insert into tus set deutsch = '$deutsch'";
$ins mysql_query($sql);
$lid mysql_insert_id();

foreach(
$_sprache as $begriff){

  if (
substr($begriff,3,1)=="E")
  {
    
$sql "insert into tus set ".
           
"ID = $lid,".
           
"english = '$begriff'";
    
$ins mysql_query($sql);
        echo 
"sql: $sql 
"
;
}
  elseif (
substr($begriff,3,1)=="J")
  {
    
$sql "insert into tus set ".
           
"ID = $lid,".
           
"japanisch = '$begriff'";
    
$ins mysql_query($sql);
  }
  else
  {
    
$sql "insert into tus set ".
           
"ID = $lid,".
           
"unklar = '$begriff'";
    
$ins mysql_query($sql);
  }
}


 
fclose($quelle);
?>

Die deutschen Einträge landen in der Datenbank, sonst aber nichts...
Was mache ich falsch?

Danke

käptn 18.05.2004 22:08

KAnn nicht funktionieren, weil:

1.) du versuchst einen zweiten Datensatz mit derselben ID (PRIMARY KEY) anzulegen (stattdessen sollte ein update mit where verwendet werden)
PHP-Code:

UPDATE tus SET english '$english' WHERE ID $lid

2.) geht oberes auch nicht da du damit vorher eingetragene englische Wörter überschreiben würdest, und du hast geschrieben, dass es mehrere englische Begriffe pro Zeile geben kann

~

shusai 18.05.2004 22:24

Hmmm, blöde Gschicht...

Was könntest du mir empfehlen?

Danke!

_m3 18.05.2004 22:27

Ein ordentliches DB-Design. Sorry, ist aber so.

shusai 18.05.2004 22:54

Und wie mach ich das?

Hat ja überhaupt nix mit der DB zu tun, das Problem ist die Textdatei!

_m3 18.05.2004 23:29

Zitat:

Original geschrieben von shusai
Und wie mach ich das?

Hat ja überhaupt nix mit der DB zu tun, das Problem ist die Textdatei!

Meinst?
Und wie bildest Du in Deiner Db mehrere engl. oder jap. Begriffe für ein deutsches Wort ab?

shusai 18.05.2004 23:51

Da sehe ich überhaupt kein Problem.
Ich will ja sowieso alle Bedeutungen für ein Wort wissen.

_m3 19.05.2004 09:03

Ahem.
Ein Datensatz in Deiner DB hat folgendes Format:
dt en jp np

Was machst Du jetzt, wenn es zu einem dt mehrere en oder jp gibt?

shusai 19.05.2004 11:00

Scheint so, als ob ich es geschafft hätte !! :)
Jetzt werden bei jeder Zeile alle Ausdrücke einer Sprache in eine Variable geschrieben und erst am Schluss wird alles in die DB geschrieben.
Deshalb ist es jetzt egal, ob es hundert Übersetzungen oder null gibt.

Hier der Code:
PHP-Code:

<?php
 set_time_limit
(7200);
mysql_connect("localhost""root""");
mysql_select_db("tus");

$quelle=fopen("dic.txt","r");
  
 while(
$line=fgets($quelle)) {
$sprache explode("#"$line);
$deutsch ="";
$english ="";
$japanisch ="";

foreach(
$sprache as $begriff){

  if (
substr($begriff,1,1)=="G")
  {
   
$deutsch .=$begriff;
}
  elseif (
substr($begriff,1,1)=="J")
  {
   
$japanisch .=$begriff;

  }
  else
  {
  
$english .= $begriff;
  }
}
$sql "INSERT into tus SET dt = '$deutsch', jp = '$japanisch', en = '$english'";
$ins mysql_query($sql);

fclose($quelle);
?>



Alle Zeitangaben in WEZ +2. Es ist jetzt 22:13 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag