PHP读取文件匹配if语句

时间:2016-02-05 11:38:54

标签: php file if-statement conditional-statements

每个人我都有以下文件,我希望显示与if条件相匹配的行并传递另一个。

我有这个TXT文件:

Doc. number|Date|Price|Description|Name
100|11/11/2015|99|Test 1|Alex
101|11/11/2015|120|Test 2
102|11/11/2015|100|Test 3|John
102|11/11/2015|140||
103|11/11/2015|110|Test 4|

这是我的PHP代码:

$file_handle = fopen("file.txt", "rb");
$i = 0;
echo "<table border='1'>";
echo "<tr><th>Doc. number</th><th>Date</th><th>Price</th><th>Description</th><th>Name</th></tr>";
while (!feof($file_handle)) {
    $line_of_text = fgets($file_handle);
    $parts = explode('|', $line_of_text);

    if($i > 1) { // Pass the first line
        echo "<tr>";
            echo "<td>" . $parts[0] . "</td>"; // Doc. number
            echo "<td>" . $parts[1] . "</td>"; // Date
            echo "<td>" . $parts[2] . "</td>"; // Price
            echo "<td>" . $parts[3] . "</td>"; // Description
            echo "<td>" . $parts[4] . "</td>"; // Name

        echo "</tr>";
    }
    $i++;
}

fclose($file_handle);
echo "</table>"

如何检查表格中是否没有“描述”和/或“名称”并传递此行。我想只显示(获取)与条件匹配的行。

如果有人有想法,我将非常感激。提前谢谢。

5 个答案:

答案 0 :(得分:1)

就像

一样简单
import re

output = {'content': {}, 'metadata': {} }

parsed_data = re.findall(r'(\w{3} \d+ [\d+:]+) (\S+) (\S+):', 'Jan 27 10:46:57 sabya-ThinkPad-T420 NetworkManager[1462]:')

output['metadata']['time'] = parsed_data[0][0]
output['metadata']['host'] = parsed_data[0][1]
output['metadata']['info'] = parsed_data[0][2]

json.dumps(output)

答案 1 :(得分:1)

如果我们有名称和描述,则只打印表格行:

if($i > 1 && $parts[3] && $parts[4]) { 

答案 2 :(得分:1)

你可以在echo语句之前放置条件,如果它是false,只需跳过“echo”;

if (count($parts) === 5) {
    $error = 0;
    foreach ($parts as $part) {
       if (empty($part)) error++;
    }

    if($i > 1 && $error === 0) {
            echo "<tr>";
                echo "<td>" . $parts[0] . "</td>"; // Doc. number
                echo "<td>" . $parts[1] . "</td>"; // Date
                echo "<td>" . $parts[2] . "</td>"; // Price
                echo "<td>" . $parts[3] . "</td>"; // Description
                echo "<td>" . $parts[4] . "</td>"; // Name

            echo "</tr>";
        }
}

答案 3 :(得分:1)

我有一个可以帮助你的解决方案 但是为什么我认为你只需要改变标题线。所以我把if($ i&gt; 1)更改为if($ i&gt; 0)

$file_handle = fopen("file.txt", "rb");
$i = 0;
echo "<table border='1'>";
echo "<tr><th>Doc. number</th><th>Date</th><th>Price</th><th>Description</th><th>Name</th></tr>";
while (!feof($file_handle)) {
    $line_of_text = fgets($file_handle);
    $parts = explode('|', $line_of_text);
    if($i > 0) { // Pass the first line
        if ( (!empty($parts[3])) && (!empty($parts[4])) ){
            echo "<tr>";
                echo "<td>" . $parts[0] . "</td>"; // Doc. number
                echo "<td>" . $parts[1] . "</td>"; // Date
                echo "<td>" . $parts[2] . "</td>"; // Price
                echo "<td>" . $parts[3] . "</td>"; // Description
                echo "<td>" . $parts[4] . "</td>"; // Name
            echo "</tr>";
        }
    }
    $i++;
}
fclose($file_handle);
echo "</table>"

答案 4 :(得分:1)

您的文件具有CSV结构,以管道分隔 因此将其解析为CSV

请注意使用array_shift获取CSV标头并将分隔符参数传递给fgetcsv

另请考虑使用implode代替在td标记之间明确传递数组的每个成员。

这是一个使用两个函数的示例,一个用于解析CSV并返回数据,
另一个用于显示数据和进行验证。

function getData($file){

    $rows = array();

    if (($handle = fopen($file, "r")) !== FALSE) {
        while (($data = fgetcsv($handle, null, "|")) !== FALSE) {

            $rows[] = $data;
        }
        fclose($handle);
    }

    return $rows;

}

function displayData($rows){

    $header = array_shift($rows);
    $output = '<table border="1">' . PHP_EOL;
    $output .= '<tr><th>' . implode('</th><th>',$header) . '</th></tr>' . PHP_EOL;

    foreach($rows as $row){

        if (isset($row[3]) and isset($row[4]) and $row[3]!='' and $row[4]!=''){
            $output .= '<tr><td>' . implode('</td><td>',$row) . '</td></tr>' . PHP_EOL;
        }

    }

    $output .= '</table>';
    return $output;

}

$rows = getData("pipe.txt");

print displayData($rows);

这将输出以下内容

<table border="1">
<tr><th>Doc. number</th><th>Date</th><th>Price</th><th>Description</th><th>Name</th></tr>
<tr><td>100</td><td>11/11/2015</td><td>99</td><td>Test 1</td><td>Alex</td></tr>
<tr><td>102</td><td>11/11/2015</td><td>100</td><td>Test 3</td><td>John</td></tr>
</table>