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

2024-10-02 10:33:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我必须在一个项目中工作,其中包含大量存储在原始文本文件中的数据。每个字段由其大小分隔,即字段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行,但不是必需的;也意味着没有C行就不能有D行。E行和F行是独立的行,只连接到a行。(所有行都是块的一部分,所以它们都可以“附加”到行a或虚拟块ID上)

我将如何创建一个允许我: -根据某些条件修改某些行上的某些数据(例如,如果C行的第5个字符为4,则第10个字符将变为7) -跟踪修改过的内容(即,我希望能够将它们与它们原来的自己联系起来) -能够重建原始文本文件,删除原始行并用修改后的版本替换它们 -能够在块中插入新行:如果C行的第7个字符=0,那么我在它下面添加一个D行。 -保持线路秩序完好。(如果插入一行,则将下一行的顺序向前移动1列)

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

如有任何建议,我们将不胜感激!在

提前谢谢你!在


Tags: 文件csv数据项目方法版本id数据库
1条回答
网友
1楼 · 发布于 2024-10-02 10:33:48

逐行检查文件并使用堆栈。大概是:

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

相关问题 更多 >

    热门问题