簡體   English   中英

PHP - 循環 CSV 文件並檢查空行

[英]PHP - Loop CSV file and check empty lines

由於各種正則表達式,我正在嘗試通讀 csv 文件並提取數據。 我無權訪問導入的 csv 文件內容。

但是,有可能一行或多行是空的。 為此,可以使用trim function()。 問題是要知道如何調整我的各種數組來恢復空行

在此處輸入圖片說明

在這個例子中,電話號碼有兩行是空的,那么我如何檢測以及如何將這些空行插入到我的手機數組中?

例如,如果我這樣做:

foreach($fullNames as $fullName)
{
    echo $fullName."<br>";
}

foreach($phones as $phone)
{
    echo $phone."<br>";
}

結果將是:

{馬克瓦多,馬克瓦多,馬克瓦多,馬克瓦多,馬克瓦多}

{0692 10 10 10, 0692 10 10 10,0692 10 10 10}

我想要實現的是:

{馬克瓦多,馬克瓦多,馬克瓦多,馬克瓦多,馬克瓦多}

{0692 10 10 10, , 0692 10 10 10, , 0692 10 10 10}

$emptyValue = "";

if (($handle = fopen($loadedSheetName.'.csv', "r")) !== FALSE) 
{ 
    fgetcsv($handle);

    while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) 
    {   
        $col = count($data);

        for($c = 0; $c < $col; $c++)
        {
            $phones = array();
            $mails = array();
            $zipcodes = array();
            $fullNames = array();

            if ('' === trim($data[$c]))
            {
                $emptyValue = "";
            }

            if(preg_match('/^(0)(692|693|262)(\d{6})$/', $data[$c], $matches))
            {
                $phones[] = "+262".$matches[2].$matches[3];
            }

            if(preg_match('/^(0)(692|693|262)( )(\d{2})( )(\d{2})( )(\d{2})$/', $data[$c], $matches))
            {
                $phones[] = "+262".$matches[2].$matches[4].$matches[6].$matches[8];
            }

            if(preg_match('/^(0)(692|693|262)( )(\d{2})( )(\d{2})( )(\d{2})(\/)(0)(692|693|262)( )(\d{2})( )(\d{2})( )(\d{2})$/', $data[$c], $matches))
            {
                $phones[] = "+262".$matches[2].$matches[4].$matches[6].$matches[8].$matches[9]."+262".$matches[11].$matches[13].$matches[15].$matches[17];
            }

            if(preg_match('/^([^\W][a-zA-Z0-9_]+)(\.[a-zA-Z0-9_]+)*(\@)([a-zA-Z0-9_]+)*(\.[a-zA-Z]{2,4})$/', $data[$c], $matches))
            {
                $mails[] = $matches[0];
            } 

            if(preg_match('/^(Sainte|Saint|saint|sainte)(-)([a-zA-z]+)$/', $data[$c], $matches))
            {
                $zipcodes[] = $matches[0];
            }

            if(preg_match('/^(([a-zA-Z\W]+)( )([a-zA-Z\W]+))$/', $data[$c], $matches))
            {
                $fullNames[] = $matches[0];
            }

            if(preg_match('/^(([a-zA-Z\W]+)( )([a-zA-Z\W]+)( )([a-zA-Z\W]+))$/', $data[$c], $matches))
            {  
                $fullNames[] = $matches[0];
            }
        }
    }

    fclose($handle);
}

您在此處向我們展示的內容包含許多不良做法。 當我們不知道問題是什么時,很難建議您應該如何解決問題; 最終結果不是填充一些 php 數組——這些只是一種臨時存儲機制。

您的問題也有些令人困惑 - 與 CSV 文件相關的“行”描述了一條記錄,而記錄由字段組成(或者有時屬性值取決於 CSV 文件的性質)。 根據您的敘述,您描述為“線”的是一個字段或一個屬性值。

CSV 文件中的每條記錄通過它出現的行保留其組成字段之間的關聯。 但是如果字段被引用或轉義,則字段本身可以包含嵌入的換行符。

通過不將空白值填充到您的臨時表示中,您正在打破這種關聯。

我想要實現的是這個

所以你想保留空白值 - 不要跳過它們。 因此,向數組添加一個空白值。

目前您的代碼結構非常糟糕且有缺陷。 您只是將元素添加到不同數組的末尾 - 您不僅會遇到空白字段的問題,而且如果在添加條件時出錯,您將失去非空白數據的數組同步。

結果將是:

不,不會。 每次您從文件中讀取一行數據時,您向我們展示的代碼都會重置輸出數組。

如果你移動

        $phones = array();
        $mails = array();
        $zipcodes = array();
        $fullNames = array();

在 while 循環之外,您將獲得與您所描述的內容相近的內容。

解決問題的正常方法是使用else if使您的每個匹配條件互斥:

        if ('' === trim($data[$c]))
        {
            $emptyValue = "";
        }
        else if(preg_match('/^(0)(692|693|262)(\d{6})$/', $data[$c], $matches))
        {
            $phones[] = "+262".$matches[2].$matches[3];
        }
        else if if(preg_match('/^(0)(692|693|262)( )(\d{2})( )(\d{2})( )(\d{2})$/', $data[$c], $matches))
        {
            $phones[] = "+262".$matches[2].$matches[4].$matches[6].$matches[8];
        ...

但是您的代碼目前是為適應記錄中以任何順序顯示的字段而編寫的。 雖然情況可能確實如此,但這是一種非常不尋常的情況,並且基於所有字段都存在(不是這種情況)而不是重復的情況。 如果您的輸入文件中缺乏結構,那么您就是在浪費時間編寫代碼來自動解析數據——即使您解決了這個問題,您也會遇到更多的痛苦。 垃圾進垃圾出。

然而作為一個純粹的學術練習,如果我們接受隱含謂詞是強制執行的,那么解決起來仍然是微不足道的 只需在您的代碼中跟蹤原始記錄關聯:

if (($handle = fopen($loadedSheetName.'.csv', "r")) !== FALSE) { 
  $phones = array();
  $mails = array();
  $zipcodes = array();
  $fullNames = array();
  $record=0;
  fgetcsv($handle);
  while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {   
    $record++;
    $col = count($data);
    for($c = 0; $c < $col; $c++) {
        if(preg_match('/^(0)(692|693|262)(\d{6})$/', $data[$c], $matches))
        {
           $phones[$record] = "+262".$matches[2].$matches[3];
        }
   ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM