2

毎週月曜日に新しいデバイス/パーツのリストを送信し、データベースに手動で入力するサプライヤがあります。

PHPを使用してこのファイルを読み取り、適切な日付ベースのレコードを更新したいと思います。データベースは作成できますが、ファイルからデータを読み取るにはどうすればよいですか?

System:         Avro
Supplier:       ABC Inc

Quantity:       1
Device:             ICD
ID:           PA-658_ao8uY
For Clarity:  PA-658_AO8UY

Quantity:       10
Device:             PSTHG
ID:              tg675_0O09i8
For Clarity:  TG675_0O09I8

上記は私たちが得るものの例です。システムは私たちであり、サプライヤーは彼らです。私たちが受け取るファイルには、数量、デバイスID、および明快さの行が何百もある可能性があります。

システム/サプライヤ名を変数に変換し、数量、デバイス、ID、およびクラリティの各エントリをループするにはどうすればよいですか?

4

3 に答える 3

1

正規表現を必要としないこの単純なタスクの場合、次のコードで正規表現を実行できます。

$content = file_get_contents("file.txt");
$content = str_replace(Array("\r\n", "\r"), "\n", $content); // we only want unix linebreaks

$data = explode("\n\n", $content);
foreach($data as &$section) {
  $lines = explode("\n", $section);
  $section = Array();
  foreach($lines as $line) {
    $colon = strpos($line, ":");
    $section[substr($line, 0, $colon)] = trim(substr($line, $colon + 1));
  }
}

print_r($data);

サンプル出力データ:

Array
(
    [0] => Array
        (
            [System] => Avro
            [Supplier] => ABC Inc
        )

    [1] => Array
        (
            [Quantity] => 1
            [Device] => ICD
            [ID] => PA-658_ao8uY
            [For Clarity] => PA-658_AO8UY
        )

    [2] => Array
        (
            [Quantity] => 10
            [Device] => PSTHG
            [ID] => tg675_0O09i8
            [For Clarity] => TG675_0O09I8
        )

)
于 2013-02-11T10:03:41.303 に答える
0

このファイルの形式を次のように再定義できる場合。

   [Core]
        System=Avro
        Supplier=ABC Inc

   [line1]   
        Quantity= 1
        Device=ICD
        ID=PA-658_ao8uY
        For Clarity=PA-658_AO8UY

   [line2]
        Quantity=10
        Device=PSTHG
        ID=tg675_0O09i8
        For Clarity:  TG675_0O09I8

を使用parse_ini_file(file,true,INI_SCANNER_NORMAL)すると、すべてのデータの多次元配列を取得できます。

これは、使用できる代替の非常に主観的なソリューションの1つです。フォーマットは安定していると思いますが、長く続くでしょう。

<?php

$newStock = new NewStockUpdate($itemListFile);

//do anything with $newStock Object




class NewStockUpdate
{

    private $System;
    private $Supplier;
    private $allUpdates;


    function __construct($listFile)
    {

    $fileHandle = fopen( $listFile, "r" ) or die("Couldn't open Update file $listFile");


    $lineSystem = explode(":",getLineData($fileHandle));
    $lineSupplier = explode(":",getLineData($fileHandle));

    $i=0;
        while(true)
        {

        $allUpdates[$i] = new ItemData($fileHandle);
        $i++;



        }

    }

    function getSystem()
    {
    return $this->System;
    }

    function getSupplier()
    {
    return $this->Supplier;
    }

    function getUpdateList()
    {
     return $this->allUpdates;
    }

}



class ItemData
{

public $Quantity;
public $Device;
public $ID;
public $ForClarity;

public $lastObject;

function __construct($filePointer)
{

    try
    {

    $lineQuantity = explode(":",getLineData($filePointer));
    $lineDevice = explode(":",getLineData($filePointer));
    $lineID = explode(":",getLineData($filePointer));
    $lineForClarity = explode(":",getLineData($filePointer));

    $this->Quantity = $lineQuantity[1];
    $this->Device = $lineDevice[1];
    $this->ID = $lineID[1];
    $this->ForClarity = $lineForClarity[1];

    }
    catch(Exception $e)
    {
     //log something
    }

    if(feof($filePointer))
    {

    $this->lastObject = true;

    }
    else
    {
    $this->lastObject=false;
    }

    function isLastRecord()
    {
        return $this->lastObject;
    }


}



}



function getLineData($filePointer)
{

while(!feof($filePointer))
{

$data = fgets($filePointer);
if(empty($data)|| $data=='\n')
{
$data = fgets($filePointer);
}
else
{
return $data;
}
}



}

?>

残りはクラスオブジェクトで管理できると思います。これらのエントリをdbおよびallに追加します。さまざまなサプライヤに対して複数のNewStockオブジェクトを作成できます。これがお役に立てば幸いです

于 2013-02-11T09:59:23.157 に答える
0
    $handle = fopen("your file ");
    //counter
    $i=0;
    $rowContentPrec=array();
    while (!feof($handle)) {
     $rowContent=explode(':',fread($handle, 8192));
     //get the system and provider
      if($i==0){      
          $sytem=$rowContent[1];
      }elseif($i==1){
          $provider=$rowContent[1];  
      }elseif(isset($rowContent)){ 
          //product
          $rowContent=explode(':',fread($handle, 8192));
          if($rowContentPrec[0]=='For Clarity'){
               //save your product to database here and initialize the    array with informations about one product
                $contentArr=array();
          }else{
            $contentArr[$rowContent[0]]=$rowContent[1];  
          } 
           $rowContentPrec=$rowContent;
          $i++; 
      }

    }
    fclose($handle);
于 2013-02-11T10:01:13.507 に答える