我想用PHP读取一个文件,文件的结构如下:
text1,text2,text3,.................
...................................
...................................
...................................
...................................
WORD;
NUMBER
col1; col2; col3; [CSV part of the file starts from here]
value1; value2; value3
我想读取文件的CSV部分并将其插入MySql数据库。我找了fgetCsv
,但找不到。怎么做?
我有一个类似的文件,需要解析并写入几列。我决定使用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
。你可以在这里阅读结果;-)
为什么不尝试读取文件的最后一行并计算分隔符的数量。之后,读取文件的每一行,直到您遇到一行具有适当数量的分隔符。一旦发生这种情况,创建一个从该行开始的新字符串,并将其解析为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部分的开头,就可以打断循环并内爆数组的其余部分。