我正试图从一个不是csv或txt的源导入数据,但我能够像我的代码一样读取文本/csv。
我遇到的问题是一些"数据记录"不遵循相同的逻辑。我有大约70%的文档符合要求,但是,我认为我可能在数据中遗漏了一些东西,从而导致结果偏离。
如果你能看一下代码和文件,并帮助我弄清楚为什么有些数据不像文档的其余部分一样工作,我将不胜感激。我怀疑这是因为其中一个字段中有奇数个字符(~和/或>),或者某些记录的开始/停止略有不同。
<?php
header("Content-Type:text/html");
$file = "data.txt";
if (($handle = fopen($file, "r")) !== FALSE)
{
fgetcsv($handle, 1000, ">~Yn");
$imports = array();
while (($data = fgetcsv($handle, 1000, ">")) !== FALSE)
{
if(strpos($data[4],'<') !== false)
{
echo "<br /><strong>Section:</strong> " . $data[5];
echo "<br /><strong>Row:</strong> " . $data[6];
echo "<br /><strong>Qty:</strong> " . $data[7];
echo "<br /><strong>Price:</strong> " . $data[8];
echo "<br /><strong>Notes:</strong> " . $data[10];
}
else
{
echo "error: ";
print_r($data);
}
echo "<br /><br /><br /><br />";
}
fclose($handle);
}
?>
示例数据可以在这里找到:示例数据
我找到了一个比我最初尝试的方法更好的解决方案。我首先确定将其作为CSV加载并不能给我带来最好的结果。然后我意识到,我遗漏的每个记录之间都有共同的分隔符。话虽如此,我将内容分成几行,然后使用split()
将这些行分成几部分。由于数据不匹配,我还忽略了第一次和最后一次匹配。
$file = "data.txt";
$content = file_get_contents($file);
$lines = split(">~", $content);
foreach($lines as $line)
{
$data = split(">", $line);
if(strpos($data['5'],'.') !== false) //if the section is a price
{
//the first match is ignored
}
elseif(empty($data['7'])) //if Qty is empty
{
//the last match is ignored
}
else
{
echo "<br><br><br>";
echo $data['5'] . " (Section) <br>";
echo $data['6'] . " (Row) <br>";
echo $data['7'] . " (Qty) <br>";
echo $data['8'] . " (Price) <br>";
//use the data
}
}
这导致了更准确和彻底的数据收集!