[英]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.