数据库模型 - 巨大的(超过 100 万行)文本文件


Data Base Model - Huge (over 1 million lines) text files

我必须处理一个涉及存储在原始文本文件中的大量数据的项目。每个字段由其大小分隔,即字段 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 行但不是必需的;E线和F线是独立的线,只连接到线A.(所有线都是块的一部分,因此它们都可以"附加"到线A或虚拟块ID)

我将如何创建一个模型,使我能够:- 根据某些条件修改某些行上的一些数据(即,如果 C 行的第 5 个字符为 4,则第 10 个字符变为 7)- 跟踪修改后的(即,我希望能够将它们链接到原始自我)- 能够重建原始文本文件,删除原始行并用修改后的版本替换它们- 能够在块中插入新行:如果行 C 有第 7 个字符 = 0,那么我在它下面添加一个 D 行。- 保持行顺序不变。(如果插入一行,它将下一行的顺序向前移动 1 个等级)

我考虑过在所有 5 个行表中使用 parent_id 外键(每种行类型一个,因为它们没有相同的字段);从而解决了行顺序问题,但我坚持重建修改后的文件版本。我还考虑过将文件划分为块(从 A 行开始),然后将行链接到块 ID......

任何建议将不胜感激!

提前非常感谢!

逐行浏览文件并使用堆栈。大致如下:

<?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更好的解决方案,但它又快又脏。您的数据库设计答案无法回答,因为我们对需求一无所知。总而言之,考虑发布您的作品,并就大问题的一小部分提出具体问题,而不是要求解决大问题。