0

パーツを削除する必要がある csv ファイルがあり、7017 行の長さがあるため、php を使用して特定のパーツを削除し、元に戻します。関連するコードは以下のとおりです。

$rows;
$count = 0;
while (($row = fgetcsv($files, 56000)) !== false) {
  $rows[$count] = $row;
  if (stristr($rows[$count][8], "Features:")) {
    $rows[$count][8] = str_replace("Features:", "features", $rows[$count][8]);
    $rows[$count][8] = str_replace(":", "", $rows[$count][8]);
    $rows[$count][8] = explode("features", $rows[$count][8]);
    if (isset($rows[$count][8][1])) {
      $rows[$count][8][1] = str_replace("Compatible", "compatible", $rows[$count][8][1]);
      $rows[$count][8][1] = explode("compatible", $rows[$count][8][1]);
      //$rows[$count][8][1] = explode("Compatible", $rows[$count][8][1]); produces error if  used
      $rows[$count][8][1] = explode("-", $rows[$count][8][1][0]);
    } else if (isset($rows[$count][8][0])) {
      $rows[$count][8][0] = str_replace("Compatible", "compatible", $rows[$count][8][0]);
      $rows[$count][8][0] = explode("compatible", $rows[$count][8][0]);
      //$rows[$count][8][0] = explode("Compatible", $rows[$count][8][0]); produces error if  used
      $rows[$count][8][0] = explode("-", $rows[$count][8][0][0]);
    } else {
      $rows[$count][8] = str_replace("Compatible", "compatible", $rows[$count][8]);
      $rows[$count][8] = explode("compatible", $rows[$count][8]);
      //$rows[$count][8] = explode("Compatible", $rows[$count][8]); produces error if  used
      $rows[$count][8] = explode("-", $rows[$count][8][0]);
    }
    $countif = 1;
    while (isset($rows[$count][8][1][0][$countif])) {
      $countif++;
    }
    $max = $countif - 2;
    $countif = 9;
    $counter = 1;
    while ($max <= 5 && $max >= 1 && $countif <= 13) {
      $rows[$count][$countif] = $rows[$count][8][1][0][$counter];
      $countif++;
      $counter++;
    }
    $rows[$count][8][0] = explode("Compatible", $rows[$count][8][0]);
    //$rows[$count][8] = $rows[$count][8][0][0];

  }
  $count++;
}

print_r($rows[14][8]);

問題は、explode ステートメントで参照される文字列に 'Compatible' が含まれていても、いわば分解されていない単一の文字列のままであるということです。出力は以下のとおりです。

100% 新品 高品質の素材で作られ、高品質を保証します 傷を防ぎます 画面上のグリースや指紋の衝突を防ぎます スタイラスでモバイルまたはテキストの人々を簡単に使用できるようになりました タッチスクリーンモバイルで使用するように設計されています対応機種: Nokia: 5530 Xpress Musicパッケージ内容: Nokia 5530 Xpress Music用スタイラス×1 - ホワイト

どんな助けでも大歓迎です。

編集var_dump($rows[14]);

0 => string '41807' (length=5)
  1 => string '' (length=0)
  2 => string 'http://images.esellerpro.com/2477/I/418/07/07_!B-dzTQ!BWk~$(KGrHqQOKnMEy1t9tWyLBM8tHiFEnQ~~0_1.JPG' (length=98)
  3 => string '' (length=0)
  4 => string '' (length=0)
  5 => string '' (length=0)
  6 => string '5055496500300    ' (length=17)
  7 => string 'STYLUS-5530-WHITE - STOCK CONTROL' (length=33)
  8 => string ' 100% Brand New Made from high quality material to ensure good quality Prevent Scratches bumps grease and finger prints on the screen You can now easily use the mobile or text people with the stylus Designed to be used with&nbsp;your touch screen mobile&nbsp;Compatible with:&nbsp;Nokia : 5530 Xpress MusicPackage Contents: 1&nbsp;x Stylus for Nokia 5530 Xpress Music -&nbsp;White&nbsp;' (length=386)
  9 => string '' (length=0)
  10 => string '' (length=0)
  11 => string '' (length=0)
  12 => string '' (length=0)
  13 => string '' (length=0)
  14 => string '-1' (length=2)
  15 => string '' (length=0)
  16 => string '' (length=0)
  17 => string 'Frooition' (length=9)
  18 => string '' (length=0)

EDIT2:元の行:

3PREPAY-ZTEMF627W1GB        http://images.esellerpro.com/2477/I/217/94/03_!B8Zel8w!2k~$(KGrHqJ!hYEyrrVkKNYBM28dwn4o!~~0_1.JPG               5.0555E+12  ZTE MF627 THREE PAY BROADBAND USB MODEM WITH 1GB READY  New ZTE MF627 on Three Pay Broadband with 1GB allowance IncludedGet broadband speeds with no wires or hassles. Just plug this lightweight USB Modem into your laptop and watch as everything auto-installs whether you’re on Windows or Mac. Easy. The user friendly dashboard is also a breeze (so you don’t need any technical knowledge) and it lets you send and receive text messages while you’re online.The MF627 gives you download speeds of up to 3.6 Mbps. Plus you can use your new best friend as a memory stick just add a MicroSD card to the slot and load up to 4GB. And don’t ever worry about losing the lid because it’s connected with a handy strap! Compatible with: Most Desktops and Laptops (Also supports Windows 7 and Mac OS X 10.6)Packing Contents:1 X Brand New ZTE MF627 USB Model on Three Pay as you go Broadband  - 1GB Allowance Included Maximum 1 per customer please.                       -1          Frooition
4

2 に答える 2

1

これがあなたの問題です..

2回目の爆発...

$rows[$count][8][0] = explode("Compatible", $rows[$count][8][0]); 

行に Features が含まれていない場合、$count[8] は展開されず、配列に変換されません。あなたの var_dump $rows[$count][8] は単なる文字列であり、 $rows[$count][8][0] は存在しません。これを行うために行を変更します..

$rows[$count][8] = explode("Compatible", $rows[$count][8]);

ただし、それを変更するのではなく、else ステートメントに入れることを検討したい場合があります。文字列に Features が含まれており、展開されている場合、今持っているものが機能するためです。したがって、Features が文字列の一部ではなく、$rows[$count][8] が展開されない場合に備えて、私が提案している行は Else ステートメントに入れる必要があります。

$rows;
$count = 0;
while (($row = fgetcsv($files, 56000)) !== false) {
  $rows[$count] = $row;
  if (stristr($rows[$count][8], "Features:")) {
    $rows[$count][8] = str_replace("Features:", "features", $rows[$count][8]);
    $rows[$count][8] = str_replace(":", "", $rows[$count][8]);
    $rows[$count][8] = explode("features", $rows[$count][8]);
    if (isset($rows[$count][8][1])) {
      $rows[$count][8][1] = str_replace("Compatible", "compatible", $rows[$count][8][1]);
      $rows[$count][8][1] = explode("compatible", $rows[$count][8][1]);
      //$rows[$count][8][1] = explode("Compatible", $rows[$count][8][1]); produces error if  used
      $rows[$count][8][1][0] = explode("-", $rows[$count][8][1][0]);
    } else if (isset($rows[$count][8][0])) {
      $rows[$count][8][0] = str_replace("Compatible", "compatible", $rows[$count][8][0]);
      $rows[$count][8][0] = explode("compatible", $rows[$count][8][0]);
      //$rows[$count][8][0] = explode("Compatible", $rows[$count][8][0]); produces error if  used
      $rows[$count][8][0][0] = explode("-", $rows[$count][8][0][0]);
    } else {
      $rows[$count][8] = str_replace("Compatible", "compatible", $rows[$count][8]);
      $rows[$count][8] = explode("compatible", $rows[$count][8]);
      //$rows[$count][8] = explode("Compatible", $rows[$count][8]); produces error if  used
      $rows[$count][8] = explode("-", $rows[$count][8][0]);
    }
    $countif = 1;
    while (isset($rows[$count][8][1][0][$countif])) {
      $countif++;
    }
    $max = $countif - 2;
    $countif = 9;
    $counter = 1;
    while ($max <= 5 && $max >= 1 && $countif <= 13) {
      $rows[$count][$countif] = $rows[$count][8][1][0][$counter];
      $countif++;
      $counter++;
    }
    $rows[$count][8][0] = explode("Compatible", $rows[$count][8][0]);
    //$rows[$count][8] = $rows[$count][8][0][0];

  }
  else // THE STRING DOESN'T CONTAIN "Features"
  {
        $rows[$count][8] = explode("Compatible", $rows[$count][8]);
  }
  $count++;
}
于 2012-04-19T14:48:01.127 に答える