-1

ファイルのコンテンツを分離する機能があります。サンプルファイル:

001;"text1"
002;"text2"
003;"text3"
999
001;"tekst11"

一部のインデックスにはいくつかの値がある場合があります。

120;"text2"
120;"text3"

私の機能:

function parseCSV($file) {
   $lines = file($file);
   $output = array();
   $i = -1;
   foreach($lines as $line) {
      $line = trim($line);
      if($line == "999") {
         $i++;
      } else {
         $ex = explode(";", $line, 2);
         $val = str_replace("\"", "", $ex[1]);
         //$dodaj = mysql_query("INSERT INTO `czynsz` (`$ex[$i]`) VALUES ('$val')");
         if(isset($output[$i][$ex[0]])) {         
            if(is_array($output[$i][$ex[0]])) {

               $output[$i][$ex[0]][] = $val;
            } else {
               $output[$i][$ex[0]] = array($output[$i][$ex[0]], $val);
            }
         } else {
            $output[$i][$ex[0]] = $val;
         }
         $dodaj = mysql_query("INSERT INTO `czynsz` (`$ex[$i]`) VALUES ('$val')");
      }
   }
   return $output;
}
$csvdata = parseCSV("woda.txt");


echo "<pre>\r\n";
print_r($csvdata);
echo "</pre>\r\n";

上記のスクリプトは、マルチレベルの配列ツリーを作成し、セパレーター (999) で配列を分離します。これは、私のファイルには多くの配列があるためです... インデックスに多くの値がある場合、スクリプトは彼のために内部ツリーを作成します。例えば:

Array
    (
    [0] => Array
        (
        [001] => 06-001-03-13
        [002] => 06447
        [003] => F
        ...
        [097] =>
        [120] => Array
            (
            [0] => text1
            [1] => text2
            )
        )
    [1] => Array
    ...

質問があり ます。このメガ アレイを MySQL ベースに保存する際に問題があります。配列内のすべてのインデックスは、データベース内で同じです。同じインデックスに多くの値 (例: 120) がある場合、内破する可能性があります。あらゆる形の助けに心から感謝します... :(

4

2 に答える 2

1

MySQL テーブルを作成します。

CREATE TABLE `czynsz` (
  `id` INT NOT NULL ,
  `value` VARCHAR( 255 ) NOT NULL
) ENGINE = InnoDB;

ALTER TABLE `czynsz` ADD UNIQUE `unique` ( `id` ) 

次に、次の php コードを使用してデータを挿入します

ini_set('error_reporting', E_ALL); // just for debugging remove later
ini_set('display_erorrs', 1); // just for debugging remove later

function parseCSV($file) {
    $lines = file($file);
    $output = array();
    $i = 0;
    foreach($lines as $line) {
        $line = trim($line);
        if($line == "999") {
           $i++;
           continue;
        }

        list($id, $val) = explode(";", $line, 2);

        $val = str_replace("\"", "", $val);

        $result = mysql_query("
            INSERT INTO `czynsz` (
                id, 
                `value`
            ) VALUES (
                '$id',
                '$val'
            ) ON DUPLICATE KEY UPDATE 
                `value` = CONCAT(`value`, ', ', '$val')"
        );
        if(!$result) {
            die(mysql_error());
        }
        if(isset($output[$i][$id])) {
            if(is_array($output[$i][$id])) {
                $output[$i][$id][] = $val;
            } else {
                $output[$i][$id] = array($output[$i][$id], $val);
            }
        } else {
            $output[$i][$id] = $val;
        }
    }
   return $output;
}
于 2012-12-23T01:12:02.553 に答える
1

PHP ハンマー ソリューションを使用する...

配列を格納するだけで、個別のノードに対してクエリを実行する必要がないと仮定すると、serialize関数を使用して配列を文字列表現に変換します。簡単にデータunserializeを取得し、元の配列を取得するために使用できます。

$s_arr = serialize($my_array);

$my_array = unserialize($s_arr);

データベース内のノードにアクセスする必要がある場合、MySQL は複雑なため、適切なソリューションではないと思います。キーと値のストアが必要な場合は、Redisなどの NoSQL ソリューションを検討する必要があります。

于 2012-12-23T01:17:04.357 に答える