我有一个包含产品数据的.txt文件,我想在php中阅读。每行包含一个产品,产品详细信息(编号,名称和价格)由选项卡分隔。正如您在下面所看到的,由于产品名称的长度不同,因此价格垂直对齐并不总是正确的。数据如下所示:
ABC001 an item description $5.50
XYZ999 an other item $6
PPP000 yet another one $8.99
AKA010 one w a longer name $3.33
J_B007 a very long name, to show tabs $99
(我不知道如何显示标签,所以它们在上面的示例中是空格,但在真实文件中,它是真正的标签)
最有效的方法是什么? (顺便说一下,它是一个远程文件)我希望有一个包含每个产品的产品数据的数组:
$product['number'], $product['name'] and $product['price']
非常感谢!
答案 0 :(得分:3)
您可以逐行读取文件(例如,使用函数file
,它将使每行进入数组的一行)。
然后,在每一行上使用explode
来分隔字段:
$data_of_line = explode("\t", $string_line);
使用“\t
”(制表“)作为分隔符。
然后,您$data_of_line[0]
包含号码,$data_of_line[1]
名称和$data_of_line[2]
价格。
答案 1 :(得分:2)
1)最简单的方法是使用file()将所有行加载到数组中(除非文件非常大,然后我会考虑另一种方法)。
2)按标签分割每一行(“\ t”字符)
3)根据需要“格式化”数组列。
示例代码段:
$productsArray = file($productsFileName, FILE_IGNORE_NEW_LINES);
foreach ($productsArray as $key => &$product) {
$arr = explode("\t", $product);
$product = array('number' => $arr[0], 'name' => $arr[1], 'price' => $arr[2]);
}
var_dump($productsArray);
答案 2 :(得分:2)
fgetcsv()是一个很好的功能
查看示例 http://us3.php.net/manual/en/function.fgetcsv.php,这是一个稍微修改过的版本:
$products = array();
$handle = fopen("products.txt", "r");
while (($data = fgetcsv($handle, 1000, "\t")) !== FALSE) {
$products[] = array(
'number' => $data[0],
'name' => $data[1],
'price' => $data[2]
);
}
fclose($handle);
答案 3 :(得分:1)
$fileArr = file('path.to.your.file.txt');
$productsData = array();
for ($i = 0; $i < count($fileArr); $i++) {
$lineData = preg_match('/^(\w{3}\d{3})\s+(.*)\s+\$(\d+(\.\d+))$/', $fileArr[$i], $matches);
$productsData[] = array(
'number' => $matches[1],
'name' => $matches[2],
'price' => $matches[3]
);
}
使用爆炸会慢一些,但它也可以解析只有一个标签作为值之间的分隔符的文件。另外,您不必从价格中删除$
符号。如果你不想用价格保持$
,那么你应该使用这个正则表达式:
'/^(\w{3}\d{3})\s+(.*)\s+(\$\d+(\.\d+))$/'