3

csv パーサー クラス (http://code.google.com/p/php-csv-parser/) を使用して、csv ファイルからデータを解析および抽出しています。私が直面している問題は、特定の csv ファイルの種類でしか機能しないことです。(Mac用、Ms-Dos用、Windows用のcsvタイプがあるようです。)

csv - windows オプションを使用して Mac (Excel) に保存された csv ファイルを使用すると、コードは機能します。ただし、Windows マシンにファイルを単純に csv として保存すると、うまくいきません。(これは、Mac で csv-windows を保存するのと同じ形式だと思うかもしれません。) csv-MSDOS ファイルとして保存すると、Windows マシンから動作します。これは少しばかげているようです。

これら 3 つのファイル タイプを標準化して、アップロードされた任意のタイプの csv をコードで読み取れるようにする方法はありますか?

私はそれが次のようなものになると考えています:

$standardizedCSV = preg_replace_all('/\r[^\n]/', '\r\n', $csvContent);

各ファイルタイプが行末を処理する方法に関係があることは知っていますが、それらの違いを理解しようとするのは少し面倒です. 誰かアドバイスがあれば教えてください。

ありがとう。

更新:これは、行ごとにデータを抽出する、使用している csv パーサーからの関連コードです。

$c = 0;
$d = $this->settings['delimiter'];
$e = $this->settings['escape'];
$l = $this->settings['length'];

$res = fopen($this->_filename, 'r');

while ($keys = fgetcsv($res, $l, $d, $e)) {

if ($c == 0) {
   $this->headers = $keys;
} else {
   array_push($this->rows, $keys);
}

$c ++;
}

fgetcsv が eol を処理する方法を理解する必要があると思います。これにより、どの形式の csv ファイルも同じ方法で処理されるようになります。

4

3 に答える 3

2

これはトリックを行うようです:

    ini_set("auto_detect_line_endings", true);

問題は行末にありましたが、独自の EOL パーサーを作成する必要はありませんでした。このランタイム設定は私のためにそれを行います。http://us.php.net/manual/en/filesystem.configuration.php#ini.auto-detect-line-endingsを参照してください。

于 2012-08-14T02:13:58.387 に答える
1

行末は問題ないと思います。CSV に関する問題は、それが「コンマ区切り値」ファイルにすぎず、それ以上に標準化されていないことです。そのため、カンマを使用して値を区切るシステムもあれば、セミコロン ( ;) を使用するシステムもあります。他の値セパレーターを使用するバリエーションもあると確信しています。

さらに、エスケープ文字 (ほとんどの場合バックスラッシュ\) は CSV ファイル間で異なる場合があり、一部の CSV ファイルでは各値を引用符で囲んでいます ( ")。

CSV ファイルでは、上記の間の任意のバリエーションを使用できます。たとえば、Microsoft Excel では、セミコロンを使用して値を区切り、値を引用符なしで CSV ファイルにエクスポートすることは確かです。

CSV ファイルの解析方法を自動検出する方法はあると思いますが、最善の方法は、ユーザーが決定できるようにすることです。それがエクセルの役目です。

于 2012-08-10T05:22:27.907 に答える
0

CSV ファイルを使用する場合、適切に標準化されていない多くの詳細に同意する必要があります。

  • 行末 (Unix 0x0a、Macintosh 0x0d、DOS 0x0d 0x0a)
  • フィールド区切り文字 (コンマ、セミコロンなど)
  • フィールドの引用 (引用されたすべてのフィールド、文字列フィールドのみ、フィールド区切り文字と行区切り文字を含む文字列フィールドのみ)
  • 文字列フィールド内の二重引用符のエスケープ (二重引用符の二重化、二重引用符の前のバックスラッシュ文字など)
  • 複数行の文字列フィールド (許可されているかどうか)
  • ファイルのエンコーディング (ISO-8859-1、UTF-8 など)

CSV リーダーを作成すると、さまざまなバリエーションの行末とフィールドの引用を自動的に処理できます。ただし、残りは事前に CSV パーサーに通知する必要があります。

デファクト スタンダードは、Excel によって生成される CSV 形式です。ただし、Excel ではさまざまなバリエーションの形式が使用されます。

  • 通常は DOS の改行です (ただし、Excel for Macintosh では試したことはありません)。
  • ロケールに応じたフィールド区切り。コンマを使用して長い数字の数字をグループ化する場合、Excel はセミコロンをフィールドの区切り記号として使用します。それ以外の場合はコンマ。
  • Excel では、必要に応じて二重引用符が使用されます。
  • Excel は、文字列フィールド内の二重引用符を二重にします。
  • Excel は、複数行の文字列フィールドをサポートしています。
  • ファイル エンコーディングは、現在のロケールのファイル エンコーディングのようです。だから、それは異なります。
于 2012-08-10T05:57:45.753 に答える