2014-04-05 174 views
0

上文件的更新中值我有2个文件(A.vcf和ref1.vcf) A.vcf这样的:PHP读取并从另一个文件

#CHROM POS ID REF ALT QUAL FILTER INFO FORMAT 
1 5 . A C 222 . INDEL;IS=6,0.111111;DP=54;VDB=1.384012e-01;AF1=0.5;AC1=1;DP4=2,3,1,4;MQ=32;FQ=10.8;PV4=1,0.38,0.00012,0.00052 GT:PL:GQ 0/1:45,0,147:47 
2 7 . G T 222 . DP=106;VDB=1.997151e-13;RPB=-2.402409e+00;AF1=1;AC1=2;DP4=1,1,44,58;MQ=20;FQ=-275;PV4=1,1,0.0029,1 GT:PL:GQ 1/1:255,248,0:99 
3 15 . A G 222 . DP=106;VDB=2.982598e-04;RPB=-2.402409e+00;AF1=1;AC1=2;DP4=1,1,44,58;MQ=20;FQ=-266;PV4=1,1,0.003,1 GT:PL:GQ 1/1:255,239,0:99 
4 11 . T A 222 . DP=85;VDB=3.949915e-01;AF1=1;AC1=2;DP4=0,0,29,44;MQ=22;FQ=-247 GT:PL:GQ 1/1:255,220,0:99 

ref1.vcf:

#CHROM POS ID REF ALT 
1 5 ref12345 A C 
2 15 ref45673 A G 
3 25 ref67893 C T 
4 35 ref66663 C A 

我想改变对应于参考文件A.vcf ref1.vcf的文件的标题。 因此,这个最初:

id = . 
ref = A 
alt = C 
qual = 222 

我想是这样的:

id = ref12345 
ref = A 
alt = C 
qual = 222 

,但没有发生变更。 我的代码是否有错误?

<?php 
    $dataSNP = "A.vcf"; 
    $handleSNP = fopen($dataSNP, "r"); 
     if ($handleSNP) 
     { 
      while (($lineSNP = fgets($handleSNP, 4096)) !== false) 
      { 
       $lineSNP = explode("\t", $lineSNP); 
       //removing first with '#' 
       if (!empty($lineSNP[0][0]) && $lineSNP[0][0] != '#') 
       { 
        $new_dataSNP[] = $lineSNP; 
       } 
      } 
      if (!feof($handleSNP)) 
      { 
       echo "Error: unexpected fgets() fail\n"; 
      } 
      fclose($handleSNP); 
     } 
     //update 'pos', but not working 
     for($i = 0 ; $i < count($new_dataSNP); $i++) 
     { 
      echo '<pre>'; 
      print("chrom = ".$new_dataSNP[$i][0]. "\n"); 
      print("position = ".$new_dataSNP[$i][1]. "\n"); 
      $file = "ref1.vcf"; 

      $handle = fopen($file, "r"); 
      if ($handle) 
      { 
       while (($line = fgets($handle, 4096)) !== false) 
       { 
        $line = explode("\t", $line); 

        if(($line[1] == $new_dataSNP[$i][1]) && ($line[3] == $new_dataSNP[$i][3]) && ($line[4] == $new_dataSNP[$i][4])) 
        { 
         $new_dataSNP[$i][2] = $line[2]; 
         break; 
        } 
       } 
       if (!feof($handle)) 
       { 
        echo "Error: unexpected fgets() fail\n"; 
       } 
       fclose($handle); 
      } 


       print("id = ".$new_dataSNP[$i][2]. "\n"); 
       print("ref = ".$new_dataSNP[$i][3]. "\n"); 
       print("alt = ".$new_dataSNP[$i][4]. "\n"); 

     } 
?> 

这段代码很简单,但我很困惑,发现错误。有什么可以帮助我吗?

+0

你真的在你的文件的制表符?在这里发布的数据中,只有空格。 – Callidior

+0

是的,我使用“标签”,而不是“空格”。你可以帮我吗? – user3193610

回答

0

很简单:fgets不会在每行的末尾切断换行符\n。因此,$line[4]包含新行字符,而$new_dataSNP[$i][4]不包含。

更换

$line = explode("\t", $line); 

$line = explode("\t", trim($line)); 
+0

但是,为什么如果我使用一个大文件登录许多2000行仍然无法更新?对于小文件或10行的情况,仍然解决。为什么喜欢它?有没有其他解决方案? – user3193610

+0

我能帮你解决问题吗,现在它可以用于不太大的文件吗?这可能是一个内存问题,因为你将整个文件读入一个数组。 – Callidior

相关问题