2009-08-03 88 views
1

我有一个带有产品数据的.txt文件,我想在php中阅读。每行包含一个产品,产品详细信息(编号,名称和价格)由制表符分隔。正如您在下面看到的,由于产品名称的长度不同,价格垂直对齐并不总是正确的。数据是这样的:php读取产品数据txt文件

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'] 

非常感谢!

回答

2

1)最简单的方法是使用文件()加载的所有行到一个数组(除非该文件是真正的大,那么我会考虑另一种方法)。

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); 
3

您可以逐行读取文件(例如,使用函数file,例如,它会让您将每行放入数组的一行)。

,然后,每个这些线路的使用explode,分隔字段:

$data_of_line = explode("\t", $string_line); 

使用 “\t”(制表“)作为分隔符

你会再有$data_of_line[0]包含数字,$data_of_line[1]名称,$data_of_line[2]价格。

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] 
    ); 
} 

这将是SLO使用爆炸,但它也可以解析多个文件,只有一个选项卡作为值之间的分隔符。另外,您不必从价格中去除$标志。如果你wan't保持$标志的价格,你应该使用这个表达式来代替:

'/^(\w{3}\d{3})\s+(.*)\s+(\$\d+(\.\d+))$/' 
+0

不\ S指的是正则表达式中的标签?产品代码也可以是别的东西,但我可以改变。 – Fortega 2009-08-03 07:00:21

+0

\ s表示任何空格,因此制表符,空格,制表符返回和换行,但是因为我们一次只匹配一行,所以只会匹配空格和制表符。这是为了防止某人犯了错误,并用空格而不是制表符分隔值,这个脚本也可以从那里获取值,而`爆炸'解决方案会崩溃。 – RaYell 2009-08-03 07:06:43

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);