0

アップロードされたテキスト ファイルを処理し、データを MySQL テーブルにインポートする完成した PHP スクリプトがあります。

テキスト ファイルがアップロードされるたびに:

  1. 既存のテーブルは削除されます
  2. 同じ名前で新しいテーブルが作成されます
  3. すべての新しいデータが新しいテーブルに挿入されます。

テキスト ファイルは、このプロセスの理由である会社の社内データベース ソフトウェアによって作成されます。

テキスト ファイル内のフィールド/値はバックスラッシュで区切られており、スクリプトはこれを正常に展開します。

$this_array = explode("\\", $this_string);

次に、各行の末尾にある改行を探して、配列のその部分を終了します (配列のその部分の末尾は、データベース行の末尾になります)。例えば。サンプル テキスト ファイル (以下) では、改行は の後に来'Row1Data for colname4'ます。配列のその部分は、データベース テーブルの行になります。

ただし、問題は、スクリプトが次のエラーを吐き出していることです。

Error #1136:Column count doesn't match value count at row 1

これは、テキスト ファイル内の複数の段落の末尾に改行があるために発生します (以下のテキスト ファイルの例を参照)。

問題: 段落の末尾が行の末尾または配列の一部として解釈されるのを回避する方法がわかりません。配列のその部分の最後として解釈されることなく、テキストの複数の段落でこのプロセスを使用し続けるにはどうすればよいですか?

テキスト ファイルの内容の例:

colname1name\colname2name\colname3name\colname4name
Data for colname1\Row1Data for colname2\This is a Row1 Paragraph to go in colname3
This is another Row1 Paragraph to go in colname3
This is yet another Row1 Paragraph to go in colname3\Row1Data for colname4
Row2Data for colname1\Row2Data for colname2\This is a Row2 Paragraph 1 to go in colname3
This is another Row2 Paragraph to go in colname3
This is yet another Row2 Paragraph to go in colname3\Row2Data for colname4

スクリプトには多くのコードがありますが、これが最も関連性の高い部分だと思います。

//
//---------------------------------------create table--------------------------------
//
$text_string="CREATE TABLE `area` (";
//loop thru names
for ($n=0; $n< count($name_array); $n++){
$name_array[$n]=trim($name_array[$n]);//trim needed here
if($name_array[$n]=='population'){//population field has to be INT

    $text_string.= "`".$name_array[$n]."` INT(8) NOT NULL,";    

}elseif($name_array[$n]=='towndescription'){//description field has to be TEXT

    $text_string.= "`".$name_array[$n]."` TEXT NOT NULL,";  

}else{
$text_string.= "`".$name_array[$n]."` varchar(250) NOT NULL default '',";
}
}
//remove last comma
$string_len=strlen($text_string);
$string_len=$string_len-1;
$text_string=substr($text_string,0,$string_len);
//
$text_string.= ") ENGINE=MyISAM ";
$db_sql_query = $text_string;
$db_result = @mysql_query($db_sql_query, $db_connection) or die ("Error #" . mysql_errno() . ":" . mysql_error());
print $text_string."<BR><BR>";//////////    
//
//----------------------------------------------------------------------------------------
//
//now loop thru $array
//

for ($n=1; $n<count($array) ; $n++){

    $text_string= "INSERT INTO `area` VALUES (";
    //for each line explode
    $this_string=$array[$n];
    $this_array = explode("\\", $this_string);
    for ($i=0; $i< count($this_array); $i++){
        //replace ' with html code - &#8217;
        $this_item=$this_array[$i];
        $this_item=trim($this_item);//trim needed here
        $this_item = str_replace("&", "and","$this_item" );
        $this_item = str_replace("'", "&#8217;","$this_item" );
        $this_item = str_replace("\"", "","$this_item" );//escaped "    

        //$this_item = str_replace(" ", "%20","$this_item" );
        $text_string.= " '".$this_item."' ,";
    }
    //remove last comma
    $string_len=strlen($text_string);
    $string_len=$string_len-1;
    $text_string=substr($text_string,0,$string_len);
    //
    $text_string.= ") ";
    $db_sql_query = $text_string;

    $db_result = @mysql_query($db_sql_query, $db_connection) or die ("Error #" . mysql_errno() . ":" . mysql_error());
print $text_string;//////////   
}

どんな助けでも大歓迎です!

4

2 に答える 2

0

すべての列が行に提供されると仮定して、バックスラッシュを爆発させてから、必要に応じて各列を取得できるように思えます。したがって、列 1、2、3、および 4 を取得し、4 番目の列を取得したら、行を書き込んでから再開します。

ここにいくつかのコードがあります:

<?php

$text = "
Data for colname1\\Row1Data for colname2\\This is a Row1 Paragraph to go in colname3
This is another Row1 Paragraph to go in colname3
This is yet another Row1 Paragraph to go in colname3\\Row1Data for colname4\\
Row2Data for colname1\\Row2Data for colname2\\This is a Row2 Paragraph 1 to go in colname3
This is another Row2 Paragraph to go in colname3
This is yet another Row2 Paragraph to go in colname3\\Row2Data for colname4
";

$lines = explode('\\', $text);
$totalCols = 4;

$currentCol = 0;
$currentRow = 0;
foreach ($lines as $line)
{
    echo $currentCol . '/' . $currentRow . ': ' . $line . "\n";
    $currentCol++;
    if ($currentCol == $totalCols)
    {
        $currentCol = 0;
        $currentRow++;
    }
}

?>

これにより、次のように出力されます。

0/0: Data for colname1
1/0: Row1Data for colname2
2/0: This is a Row1 Paragraph to go in colname3 This is another Row1 Paragraph to go in colname3 This is yet another Row1 Paragraph to go in colname3
3/0: Row1Data for colname4
0/1: Row2Data for colname1
1/1: Row2Data for colname2
2/1: This is a Row2 Paragraph 1 to go in colname3 This is another Row2 Paragraph to go in colname3 This is yet another Row2 Paragraph to go in colname3
3/1: Row2Data for colname4

これは、あなたが遊ぶことができるライブデモです。

データを機能させるには、データを微調整する必要がありました-「colname4のRow1Data」にはバックスラッシュターミネーターがありません。

于 2013-04-26T21:29:17.303 に答える