1

始める前に、これが CSV であることと、PHP に組み込まれている関数があることを知っています。私は次のパターンを得ました:

preg_match_all("/([^\"]|\"[^\"]*\")*?(r\n|\n\r|\r|\n)/i", $CSV, $Matches);

誰がそのようなものを解析しますか:

Country,Region/State,City,"Zip/Postal Code\n From","Zip/Postal Code To","Weight From","Weight To","Shipping Price","Delivery Type"\n\r
CAN,*,,,,0.0000,4999.0000,29.7500,Priority\n\r
CAN,*,,,,10000.0000,19999.0000,35.5000,Express\n\r
CAN,*,,,,0.0000,4999.0000,19.7500,Express\n\r
CAN,*,,,,20000.0000,99999999.9999,59.0000,Priority\n\r
CAN,*,,,,5000.0000,9999.0000,34.7500,Priority\n\r
CAN,*,,,,20000.0000,99999999.9999,41.5000,Express\n\r
CAN,*,,,,5000.0000,9999.0000,24.4500,Express\n\r
CAN,*,,,,10000.0000,19999.0000,48.0000,Priority\n\r
CAN,*,,,,10000.0000,19999.0000,29.7500,Standard\n\r
CAN,*,,,,20000.0000,99999999.9999,36.5000,Standard\n\r
CAN,*,,,,500.0000,9999.0000,20.3500,Standard\n\r
CAN,*,,,,90.0000,499.0000,9.7500,Standard\n\r
CAN,*,,,,50.0000,89.0000,1.8000,Standard\n\r
CAN,*,,,,30.0000,49.0000,1.5000,Standard\n\r
CAN,*,,,,0.0000,29.0000,1.0000,Standard\n\r
USA,*,,,,20000.0000,99999999.9999,160.0000,Express\n\r
USA,*,,,,10000.0000,14999.0000,76.0000,Express\n\r
USA,*,,,,1000.0000,4999.0000,42.0000,Express\n\r
USA,*,,,,15000.0000,19999.0000,155.0000,Priority\n\r
USA,*,,,,5000.0000,9999.0000,94.0000,Priority\n\r
USA,*,,,,0.0000,999.0000,75.5000,Priority\n\r
USA,*,,,,15000.0000,19999.0000,98.0000,Express\n\r
USA,*,,,,5000.0000,9999.0000,61.5000,Express\n\r
USA,*,,,,0.0000,999.0000,40.0000,Express\n\r
USA,*,,,,20000.0000,99999999.9999,230.0000,Priority\n\r
USA,*,,,,10000.0000,14999.0000,120.0000,Priority\n\r
USA,*,,,,1000.0000,4999.0000,61.5000,Priority\n\r
USA,*,,,,500.0000,999.0000,25.5000,Standard\n\r
USA,*,,,,90.0000,499.0000,13.3500,Standard\n\r
USA,*,,,,50.0000,89.0000,3.0000,Standard\n\r
USA,*,,,,30.0000,49.0000,1.8000,Standard\n\r
USA,*,,,,0.0000,29.0000,1.5000,Standard\n\r

私が得る結果は次のようになります:

[2] => Array
    (
    )

[3] => Array
    (
        [0] => CAN
        [1] => *
        [2] => 
        [3] => 
        [4] => 
        [5] => 10000.0000
        [6] => 19999.0000
        [7] => 35.5000
    )

[4] => Array
    (
    )

[5] => Array
    (
        [0] => CAN
        [1] => *
        [2] => 
        [3] => 
        [4] => 
        [5] => 0.0000
        [6] => 4999.0000
        [7] => 19.7500
    )

[6] => Array
    (
    )

?:改行グループに追加しようとしても、それは行われます。誰でも私を助けることができます、私はそこで立ち往生しています。ありがとう。

4

1 に答える 1

1

PHPマッチングの詳細がわからないので、正規表現があなたが示しているように機能しているというあなたの言葉を受け入れます(同じ方法でキャプチャしていない私の好みの正規表現を使用します)。

これらの空白の一致を削除しようとしていると思います。\また、これらの「改行」は実際には入力にエンコードされており、リテラルの 's および\r's および'sとして残されていないと信じています\n

問題は、「改行」が2回一致しているようです? \n1 つのパスでのみ一致し、次のパスで一致するように\r?

最も簡単な解決策は、改行をファイルに含まれていることがわかっているタイプに制限することです/([^\"]|\"[^\"]*\")*?(\n\r)/ 。これは役に立ちますか?

または、入力の各行で正規表現の分割 (カンマ区切り) を使用します。

于 2012-07-25T22:09:31.200 に答える