2012-10-31 4 views
6

私は正常に動作しているウェブサイトのデータベースにテキストエリアを送信しています。しかし、私のデータベースからCSVを(PHP経由で)生成すると、すべての改行が結果としてCSVに混乱します。どのCSVリーダーでも、入力から改行に変換されます。すべての改行を削除して、適切なCSVを生成するにはどうすればよいですか?

私は、次のアプローチを試してみました:

  1. は引用符でフィールドをカプセル化します。

  2. この

    $field = str_replace(array('\n', '\r', '\r\n', '\n\r'), ',', $original_field); 
    
  3. また、この:上記のすべてのアプローチを組み合わせる

    $field = strip_tags(nl2br($original_field)); 
    

とにかく、終了結果は、ユーザによって入力された改行で改行される混乱したCSVになります。私はテキストエリアからの新しい改行をブロックすることができましたが、CSV側でもこれを修正する必要があるレガシーな投稿がたくさんあります。

なぜ機能しないのですか?この問題を解決するにはどうすればよいですか?

+0

あなたは同様に、異なる順序でそれを使用する必要がありますか? –

+0

データベースエントリはすでにCSV形式ですか? –

+0

いいえ。私はfwriteで生成しています。しかし、返信を読んだ後、私はputcsv経由で再考して生成するかもしれません。 –

答えて

10

(ユーザーuser1517891の)受け入れ答えが正しくない前\r\nがあるとき、それは2つのコンマ,としてそれに取って代わるだろう...、二回の文字列に置き換えられます。最初に\r =>,の代わりに\n =>,と置き換えられます。どのようにあなたのCSVを作成している

$field = str_replace(array("\r\n", "\n\r", "\n", "\r"), ',', $original_field); 
2

\nなどのタグを二重引用符で囲む必要があります。そうしないと、改行ではなく単純な文字列として扱われます。

7

二重引用符を使用:あなたはfputcsv()を使用している場合

$field = str_replace(array("\n", "\r", "\r\n", "\n\r"), ',', $original_field); 
+2

これは正しくありません。 – Legionar

1

この問題は存在すらしないでください。

fputcsv($f, array($field1, $field2, $field3)); 

デフォルトでは、文字列のエンクロージャとして区切り文字と二重引用符としてコンマを使用しています。

+0

私はそれも考えましたが、彼は出力についてはあまり指定していませんでした。彼はそれをCSVと呼んでいますが、入力からどのように処理されるかはわかりません。コード内の置換文字列に使用されているコンマを考えると、ユーザー入力自体はすでにCSV形式の行であると思われる可能性がありますか?これは 'fputcsv()'が彼の直面する問題に対する解決策ではないことを意味します。行間を読むと、 'fputcsv()'を使ってコードを簡略化できるように見えるかもしれませんが、今のところ彼がやっていることにはかなり大きな変更になるでしょう。 – SDC

2

str_replace()ではなく、preg_replace()を使用することをおすすめします。その理由は、複数の改行と\r\nの組み合わせがある可能性があり、すべてを1つのカンマで置き換えたいと思うからです。

また、末尾の空白行を削除するにはtrim()を使用することをおすすめします。

$field = preg_replace('/[\n\r]+/', ',', trim($original_field)); 
関連する問題