2011-08-11 45 views
0

我需要打印出csv文件轉換成HTML或者把數字數據存入數據庫:
但我需要在特定位置,開始一個循環,並在另一個特定打破它位置(正則表達式)。
所以我需要重印只有行數字數據和他們的所有列。
以下是僞碼 - 不能正常工作:PHP遍歷CSV - 啓動和正則表達式的結束循環

<?php 
$row = 1; 
$handle = fopen("test.csv", "r"); 
while ($data = fgetcsv($handle, 1000, ",")) 
{ 
    if (preg_match('/[Morning]/', $data[0]) === 1 // start at this rwo plus two lines down) 
    { 
    $num = count($data); 
    $row++; 
     for ($c=0; $c < $num; $c++) 
     { 
      for ($c=0; $c < $num; $c++) 
      { 
       echo $data[$c] . " "; 
      } 
     if (preg_match('/[Total Cash:]/', $data[0]) === 1) 
     { break; row -1 }    
     } 
     echo "<br>"; 
    } 
} 
fclose($handle); ?> 

因此CSV是這樣的:

 
/--some lines--/

Date: 3/3/11, Morning, --blank line--- Customer No,Time,CheckNo,Total, 1234,12-45,01,20.00, 1236,1-00,03,30.00, 1240,2-00,06,30.00, --more numerical rows of data at variable length that I need to loop over-- 1500,4-00,07,22.00, ----,----,---,----, Total Cash, , , ,120.00,

/--some other lines--and it goes/

Lunch Time, ---similar like Morning above ---

任何信息如何正確addrres這一問題表示讚賞,我現在可以做這麼多的循環和正則表達式但有了這個,我需要更多的時間和幫助。謝謝。

+2

不是典型的CSV文件,安永? –

+0

'/ [早上] /'?你正在尋找一個包含'M','o','r',...,或''g'的值? – KingCrunch

+0

是的 - 它應該只是'早上'.. – phpJs

回答

0
$lines = file('test.csv'); //read file into an array, one entry per line 

$active = false; //keep track of what rows to parse 

//loop one line at a time 
for ($i = 0; $i < count($lines); $i++) { 
    $line = $lines[$i]; 

    if (strpos($line, 'Morning') !== false) { //start parsing on the next row 
    $active = true; 
    $i += 2; //skip the blank line and header 
    continue; 
    } 
    if (strpos($line, '----,') !== false) { //stop parsing rows 
    $active = false; 
    } 

    if ($active) { //if parsing enabled, split the line on commas and do something with the values 
    $values = str_getcsv(trim($line)); 
    foreach ($values as $value) { 
     echo $value . " "; //these are the numbers 
    } 
    } 

} 
+0

這個工作得很好。函數名稱是str_getcsv。 – phpJs

0
$lines = file('test.csv'); 
$parsing = false; 
foreach ($lines as $line) 
{ 
    $parsing = ((strpos($line, 'Morning') !== false) || $parsing) 
     && ((strpos($line, 'Total Cash') === false); 

    if (!$parsing) 
     continue; 

    $values = strgetcsv($line); 
    echo implode(' ', $values); 
} 

編輯:基本上,它同樣丹Grossmans的解決方案,但較短的;-)

+0

不應該使用'explode()'來解析CSV數據,因爲'firstvalue,「second,value」'不能正確識別。 – KingCrunch

+0

我剛剛意識到這一點,並編輯了您的解決方案。這種方式更好,更清潔。 –

+0

@格羅斯曼:首先在這裏閱讀,因此它只是運氣不佳;)但是正確;假設這些值都是數字(用'.'作爲小數點分隔符),允許在這裏使用'explode()'。我的不好 – KingCrunch

0
$lines = file('test.csv'); 

// Skip the unwanted lines 
// Means: Every line until the line containing "Morning," 
do { 
    $line = array_shift($lines); 
} while(trim($line) !== 'Morning,'); 
$lines = array_slice($lines, 2); // Mentioned something about "2 lines below" or such" ^^ 

// Do something with the remaining lines, until 
// Line _begins_ with "Total Cash" 
while(strncmp('Total Cash', trim($line = array_shift($lines)), 10) !== 0) { 
    echo implode(' ', str_getcsv($line)) . PHP_EOL; 
} 
+0

注意:如果你只有''''''''行序列來解析,這隻會起作用。如果稍後在文檔中有第二段要分析的段落,則不會捕獲它 –

+0

這看起來像是一個賬單或其他東西,所以可以假定,沒有其他段落可以解析。另一方面,它非常簡單:將全部內容包裝在'do {/ *在代碼中回答* /} while(!empty($ lines));' – KingCrunch

+0

當然 - 這不是批評你的答案,只是一張紙條 ;) –