2

我想用PHP读取一个文件,文件结构如下:

text1,text2,text3,.................

...................................

...................................

...................................

...................................

WORD;

NUMBER

col1; col2; col3; [CSV part of the file starts from here]

value1; value2; value3

我想读取文件的CSV 部分并将其插入 MySql 数据库。我寻找fgetCsv但无法这样做。这样做的方法是什么?

4

2 回答 2

0

您为什么不尝试读取文件的最后一行并计算分隔符的数量。之后读取文件的每一行,直到遇到具有适当数量的分隔符的行。一旦发生这种情况,从该行开始创建一个新字符串并将其解析为 csv。

$arr = @file('foo.php');
$lastLine = $arr[count($arr)-1];
$delimiterCount = substr_count($lastLine,";");
$csvStarted=false;
$csvString="";
foreach($line in $arr) {
    if($csvStarted) {
        $csvString += $line + "\r\n";
    } else {
        if(substr_count($line,";")==$delimiterCount) {
            $csvStarted=true;
            $csvString += $line + "\r\n";
        }
    }
}

代码效率不高,但能给你一个想法。一旦你找到 CSV 部分的开始,你就可以打破循环并内爆数组的其余部分。

于 2012-09-11T08:05:54.610 回答
0

我有一个类似的文件,我需要解析并写入几列。我决定逐行读取文件,使用fgetcsv

exec('wc -L file.tmp',$res,$stat);
$length = (int)($stat === 0 ? $res[0] : 200);
$fh = fopen('file.tmp','r');
$fields = false;
while($line = fgetcsv($fh,$length,';'))
{
    if (count($line) <= 1)//not more than one semi-colon
    {
        continue;//not part of csv-section, read on
    }
    if (!$fields)
    {
        $fields = $line;//<-- first line of CSV === columns
        continue;
    }
    //$line should be what you need here.
}

现在,就我而言,我决定将结果写入一个新的 csv 文件,并使用LOAD LOCAL INFILE. 你可以在这里阅读结果如何;-)

于 2012-09-11T07:58:17.093 回答