3

注:最初に、本当に明らかな何かが欠けている可能性があることを知っていると言うことから始めます。私は、単純な解決策が見えないコーディングの混乱の 1 つにいます。

問題: PHP でスクリプトを作成して、.csv ファイルを解析し、電子メール アドレスを含む列を選択して、データベースに配置しました。現在、ユーザーが .csv ファイル タイプを持つファイルをアップロードしようとしていることがわかりましたが、実際にはカンマ区切りではありません。区切り文字 (タブ、改行、スペースなど) を適切に決定する関数を作成しようとしていますが、問題が発生しています。キーの数がその区切り文字に信頼性を追加するように、これらすべてのアドレスの配列を取得したいと思います。

コード:

$filename = "../some/path/test.csv";   
if (($handle = fopen($fileName, "r")) !== FALSE) {
    $delimiters = array(',', ' ', "\t", "\n");
    $delimNum = 0;
    foreach ($delimiters as $delimiter) {
      $row = 0;
      while (($data = fgetcsv($handle, 1000, $delimiter)) !== FALSE) {
        $data = (string)$data[0];
        $delimiterList[$delimNum] = explode($delimiter, $data);
        $row++;
    }
    $delimNum++;
}
die(print_r($delimiterList));
}

結果:

Array
(
[0] => Array
    (
        [0] => email
peter.parker@example.com
atticus.finch@example.com
steve.rogers@example.com
phileas.fogg@example.com
s.winston@example.com
paul.revere@example.com
fscott.fitzgerald@example.com
jules.verne@example.com
martin.luther@example.com
ulysses.grant@example.com
tony.stark@example.com
    )
)

私が言ったように、これはおそらくこれにアプローチするための間違った方法であることを知っているので、あなたが提供できる洞察に感謝します!

4

5 に答える 5

3

この問題は、コードではなく使いやすさで解決してください。ユーザーに区切り文字を選択してもらいます。

ただし、どのタブ区切り、CSV などを意味するかがわからない可能性があるため、プレビューを表示するだけです。出力が正しく表形式になるまで、オプションから選択できます。

次に、選択した形式に従って解析します。

于 2013-02-19T02:20:59.567 に答える
2

この問題を簡単な問題と考えないでください。これは推測に似ているため、この問題には完全な解決策はありません。

代わりに、統計またはその他のヒューリスティックを使用して、99% の適切なソリューションを近似しようとする必要があります。私はコンピューター科学者であり、開発者でもありますが、これは機械学習またはデータ科学者が与える概算です。

ここにあります:

  1. ファイルのすべての行からランダムな行数を選択します。たとえば、10 行です。
  2. 各区切り候補の出現回数をカウントする
  3. この数値を使用して、各区切り文字の平均と分散を計算します。
  4. 数値を正規化します。これは、カスタム線形関数を使用して、0 と 1 の間の数値を与えることを意味します
  5. 各区切り記号と sum の 2 つの値に重みを付けます。これにより、決定として使用できる各区切り記号のスコアが得られます。

複雑に見えますが、かなり優れたアルゴリズムであり、難しくありません。以下に、計算の一例を示します。

区切り文字数 (ヒストグラム)

|         | ; | , | \t  |
|---------|---|---|-----|
| LINE 1  | 3 | 1 |  13 |
| LINE 2  | 2 | 1 |   0 |
| LINE 3  | 3 | 1 |   0 |
| LINE 4  | 3 | 1 | 124 |
| LINE 5  | 2 | 1 |   2 |
| LINE 6  | 2 | 1 |   2 |
| LINE 7  | 3 | 1 |  12 |
| LINE 8  | 3 | 1 |   0 |
| LINE 9  | 3 | 1 |   0 |
| LINE 10 | 3 | 1 |   0 |

計算と最終スコア

|            |  ;   |  ,   |  \t  |  | WEIGHTS |  ;   |  ,   | \t |
|------------|------|------|------|--|---------|------|------|----|
| AVERAGE    |  2,7 |    1 | 15,3 |  |         |      |      |    |
| NORMALIZED | 0,17 | 0,06 |    1 |  | 1       | 0,17 | 0,06 |  1 |
| VARIANCE   | 0,21 |    0 | 1335 |  |         |      |      |    |
| NORMALIZED | 0,99 |    1 |    0 |  | 3       | 2,99 |    3 |  0 |
|            |      |      |      |  | SCORE   | 3,17 | 3,06 |  1 |

ご覧のとおり、区切り文字「;」の方がスコアが良いです。見つかった区切り文字の平均よりも分散に重みを付けるのも良いと思います。区切り文字が各行であまり変化しないファイルを持つ可能性が高くなります。

于 2018-03-27T10:00:43.853 に答える
1

これは完全な解決策ではありませんが、区切り文字が何であるかを尋ねることができない場合は、役立つかもしれません。

もう CSV として解析しようとする代わりに、有効な電子メール アドレスを取得してみてください。スペース、コンマ、タブ、または改行が有効な電子メールの部分だと思いませんか? (誰にもわかりません ;)正規表現を使用して電子メールを検証する方法については、こちらのディスカッションを参照してください。このソリューションのいくつかの落とし穴がわかります。

しかし、その後、preg_match_all() を使用して正規表現を記述し、有効な電子メール形式ですべての文字列のリストを取得します。

幸運を!

于 2013-02-19T02:14:00.030 に答える