-4

データをMYSQLデータベースにダンプする前にテキストファイルを検証することは可能ですか?

たとえば、(データの)5つの列が含まれているかどうかを確認したいと思います。もしそうなら、私は次のクエリを進めます:

LOAD DATA CONCURRENT INFILE 'c:/test/test.txt' 
INTO TABLE DUMP_TABLE FIELDS TERMINATED BY '\t' ENCLOSED BY '' LINES TERMINATED BY '\n' ignore 1 lines.

そうでない場合は、行全体を削除します。txtファイルのすべての行に対してこのプロセスを繰り返します。

テキストファイルには、次の形式のデータが含まれています。

id  col2    col3    2012-07-27-19:27:06 col5

id  col2    col3    2012-07-25-09:58:50 col5

id  col2    col3    2012-07-23-10:14:13 col5
4

6 に答える 6

2

編集:コメントを読んだ後、タブ区切りのデータで同じことを行うためのコードは次のとおりです。

$handler = fopen("myfile.txt","r");
$error = false;
while (!feof($handler)){
   fgets($handler,$linetocheck);
   $cols = explode (chr(9), $linetocheck); //edit: using http://es.php.net/manual/en/function.fgetcsv.php you can get the same result as with fgets+explode
   if (count($cols)>$max_cols){
       $error=true;
       break;
   }
}
fclose($handler);
if (!$error){
    //...do stuff
}

このコードは、ファイル(たとえば、「myfile.txt」)を1行ずつ読み取り、いずれかの行の長さが$ max_colsを超える場合、変数$errorをtrueに設定します。(それがあなたが求めているものではない場合、私の謝罪、あなたの質問は私にとって最も明確ではありません)

$handler = fopen("myfile.txt","r");
$error = false;
while (!feof($handler)){
   fgets($handler,$linetocheck);
   if (strlen($linetocheck)>$max_cols){
       $error=true;
       break;
   }
}
fclose($handler);
if (!$error){
    //...do stuff
}
于 2012-08-05T22:51:51.390 に答える
2

それが古いスレッドであることは知っていますが、私は自分自身に似たものを探していて、このトピックに出くわしましたが、ここで提供された答えはどれも私を助けませんでした。

したがって、私は先に進んで、テストされ、完全に機能する(改善できる)独自のソリューションを用意しました。

example.csv次のダミーデータを含むという名前のCSVファイルがあるとします(意図的に、最後の行の6番目には、1つの追加データが含まれ、次に他の行が含まれます)。

Name,Country,Age
John,Ireland,18
Ted,USA,22
Lisa,UK,23
Michael,USA,20
Louise,Ireland,22,11

ここで、CSVファイルをチェックして、すべての行に同じ数のデータがあることを確認すると、次のコードブロックがトリックを実行し、エラーが発生した行を特定します。

    function validateCsvColumnLength($pathToCsvFile)
    {
        if(!file_exists($pathToCsvFile) || !is_readable($pathToCsvFile)){
            throw new \Exception('Filename doesn`t exist or is not readable.');
        }

        if (!$handle = fopen($pathToCsvFile, "r")) {
            throw new \Exception("Stream error");
        }

        $rowLength       = [];
        $rowNumber       = 0;
        while (($data    = fgetcsv($handle)) !== FALSE) {
            $rowLength[] = count($data);
            $rowNumber++;
        }
        fclose($handle);

        $rowKeyWithError   = array_search(max($rowLength), $rowLength);
        $differentRowCount = count(array_unique($rowLength));

        // if there's a row that has more or less data, throw an error with the line that triggered it
        if ($differentRowCount !== 1) {
            throw new \Exception("Error, data count from row {$rowKeyWithError} does not match header size");
        }
        return true;
    }

実際にテストするには、var_dump()を実行して結果を確認します。

   var_dump(validateCsvColumnLength('example.csv'));
于 2020-06-19T17:04:30.883 に答える
0

どういう意味ですか?行の文字数だけを意味する場合はexplode、ファイルを多くの行に分割()して、それらの長さが5に等しいかどうかを確認します。

デリメータのある列を意味する場合は、各行でそのスプリッタの発生量を見つけて、それらが5に等しいかどうかをもう一度確認する必要がありfgetcsvます。

于 2012-08-05T22:46:34.140 に答える
0

fgetcsvあなたはそれで十分かどうか確かめることができます。そうでない場合は、列の意味をもう少し詳しく説明してください。

于 2012-08-05T22:46:52.033 に答える
0

ファイルの各行の長さについて話していると思います。もしそうなら、ここに可能な解決策があります。

$file_handle = fopen("myfile", "r");
while (!feof($file_handle)) {
   $line = fgets($file_handle);
   if(strlen($line)!=5) {
       throw new Exception("Could not save file to database.");
       break;
   }
}
fclose($file_handle);
于 2012-08-05T22:48:42.067 に答える
0

はい、可能です。私はまさにそのことをしました。PHPのcsv処理関数を使用します。

次の関数が必要になります。

fopen()fgetcsv()

そしておそらく他のいくつか。

fgetcsvは配列を返します。

検証方法の簡単な例を示します。

csvは次のとおりです:col1、col2、col3、col4 1,2,3,4 1,2,3,4、1,2,3,4,5 1,2,3,4

fopenの部分をスキップして、検証ステップに直接進みます。「\t」はタブ文字であることに注意してください。

$row_length;
$i = 0;
while($row = fgetcsv($handle,0,"\t") {
  if($i == 0) {
    $row_length = sizeof($row);
  } else {
    if(sizeof($row) != $row_length) {
      echo "Error, line $i of the data does not match header size";
      break;
    }
  }
}

これにより、各行がテストされ、最初の行($ i = 0)の長さと同じであることを確認します。

編集:そして、インターネットを検索する方法がわからない場合は、ここにfgetcsvのページがあります:http: //php.net/manual/en/function.fgetcsv.php

関数プロトタイプは次のとおりです。arrayfgetcsv(resource $ handle [、int $ length = 0 [、string $ Delimiter ='、' [、string $ Enclosure ='"' [、string $ escape ='\']]]] )。

ご覧のとおり、データをLOAD DATA IN FILEに送信する前に、PHPでクイックスキャンを実行するために必要なすべてのものが含まれています。

私は自分のプログラムであなたの正確な問題を解決しました。私のプログラムはまた、重複する行やその他のクールなものを自動的に削除します。

于 2012-08-05T22:56:26.123 に答える