2013-02-11 2 views
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 

Вышеприведенный пример того, что мы получаем. Система - это мы, поставщик - это они. В файле, который мы получаем, может быть сотни для количества, идентификатора устройства и линий четкости.

Как использовать имена систем/поставщиков для переменных, а затем прокручивать каждый из записей количества, устройства, идентификатора и ясности ???

+0

Так ваша проблема * чтение * файл, а не разбор его содержимое? –

+0

Вы можете проанализировать файл с помощью RegEx, но я бы не назвал его надежным, поскольку, если изменения разметки могут привести к искаженным данным в вашей базе данных. Я предлагаю связаться с ними и попросить их отправить второй файл с данными в более подходящем формате для синтаксического анализа, например XML или JSON. – Ranty

+0

Привет. извините, если я это плохо сформулировал. Проблема заключается в получении данных из файла, поэтому я могу записать их в базу данных. – MacMan

ответ

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 
     ) 

) 
+0

Спасибо.Это работает, но первый массив [0] содержит: '[0] => Массив ( [System] => Avro [Поставщик] => ABC Inc [Количество] => 1 [Устройство] => ICD [ID] => PA-658_ao8uY [For Clarity] => PA-658_AO8UY ) ' – MacMan

+0

woops. у моего файла не было новой строки между двумя записями. – MacMan

+0

Как мне заставить это работать на PHP4? – MacMan

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) может дать вам многомерный массив всех данных.

Это одно альтернативное очень субъективное решение, которое вы можете использовать. Я просто предполагаю, что формат стабильный, и будет длиться долго.

<?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 и все. Вы можете создать несколько объектов NewStock для разных поставщиков. Надеюсь, это поможет

+0

Спасибо за ответ. Поставщик отправляет тот же отформатированный файл большому количеству реселлеров. Я не думаю, что они изменят его для меня. Формат всегда находится в блоке 4 Количество, Устройство, ID, Ясность. Надеюсь, это поможет! – MacMan

+0

Может быть, вы можете попробовать. – Kris

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); 
Смежные вопросы