我必须处理一个涉及存储在原始文本文件中的大量数据的项目。每个字段由其大小分隔,即字段1从位置0到3等。(不是CSV文件)
该文件包含超过一百万行。
我需要将它存储到数据库中。我查了几篇关于什么是最好的方法的帖子,看起来技术选择比算法更重要。我对Php,Perl或Python持开放态度。随意提出任何建议。
现在,文件结构本身有点棘手。这是一个例子:
A880780093vvd47aa8db20d4133e6f587cf046054e8316000212093659D11001
C880780093d47aa8db20d4133e6f587cf046054e831600021209365907000 0711012012C
A880780093vvcaacb22bfb091127f9c9e14175d858ee25000212093681O11001
C880780093caacb22bfb091127f9c9e14175d858ee2500021209368107000 0611012012ADI
D880780093caacb22bfb091127f9c9e14175d858ee250002120936810700011012012HK00210Z
A880780093vvb92f937a3fd1268c1478deb174a1bfca86000212093750S11041
C880780093b92f937a3fd1268c1478deb174a1bfca8600021209375007000 3911012012PB
C880780093b92f937a3fd1268c1478deb174a1bfca8600021209375007000 3911012012B 1002
E880780093212093750b92f937a3fd1268c1478deb174a1bfca8600007000110120120100000127000000000000
C880780093b92f937a3fd1268c1478deb174a1bfca8600021209375007000 3911012012B
基本上,有6种类型的线,从A到F; A行是块的标题。 B行和C行具有完全相同的长度和字段。线D是线C的可能补充,意味着它连接到线C但不是必需的;也就是说没有线D就不能有线D.线E和F是独立线,只连接到线A.(所有线都是块的一部分,所以它们都可以“连接”到A线,或者虚拟块ID)
我将如何创建一个允许我的模型: - 根据某些标准修改某些行上的某些数据(即,如果C行的第5个字符为4,则第10个变为7) - 跟踪修改过的(即,我希望能够将它们链接到原始的自我) - 能够重建原始文本文件,删除原始行并将其替换为修改后的版本 - 能够在块中插入新行:如果行C有第7个char = 0,那么我在它下面添加一个D行。 - 保持线顺序完好无损。 (如果插入了一行,则会将后续行的顺序向前移动1个等级)
我考虑在所有5个行表中使用parent_id外键(每个行类型一个,因为它们没有相同的字段);从而解决了线路排序问题,但我仍然坚持重建修改后的文件版本。我还想过将文件分成块(从A行开始),然后将行链接到块ID ...
任何建议都将不胜感激!
提前多多感谢!
答案 0 :(得分:0)
逐行浏览文件并使用堆栈。一些事情:
<?php
// You'd have to implement the database yourself!
$db = new Database();
$db->startTransaction();
$stack = array();
$fh = fopen("my-file", "r");
$i = 0;
while (($buffer = fgets($handle, 4096)) !== false) {
if (!isset($buffer[0])) {
continue;
}
switch ($buffer[0]) {
case "A":
// Do something ...
break;
case "C":
// Do something ...
break;
case "C":
if ($stack[$i] != "C") {
trigger_error("Line D without preceding line C");
}
// Do something ...
break;
// More stuff ...
}
$stack[$i++] = $buffer;
$db->insert("INSERT INTO table (line) VALUES ($buffer)");
}
$db->commitTransaction();
?>
当然有比丑陋的switch
更好的解决方案,但它很快就会出现问题。您的数据库设计答案无法回答,因为我们对这些要求一无所知。总而言之,考虑发布你的工作并询问有关一小部分大问题的具体问题,而不是要求解决大问题。