【问题标题】:php read and updating value on file from another filephp从另一个文件读取和更新文件上的值
【发布时间】:2014-04-05 05:40:32
【问题描述】:

我有 2 个文件(A.vcf 和 ref1.vcf) A.vcf 是这样的:

#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");

        }
?>

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

【问题讨论】:

  • 您的文件中真的有标签吗?在您在此处发布的数据中,只有空格。
  • 是的,我使用“制表符”,而不是“空格”。你能帮帮我吗?

标签: php file fopen fgets


【解决方案1】:

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

替换

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

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

【讨论】:

  • 但是,为什么如果我使用一个大文件邓很多2000行仍然无法更新?对于小文件或者10行的情况,还是解决了。为什么喜欢?还有其他解决办法吗?
  • 我说得对吗,它现在适用于不太大的文件?这可能是内存问题,因为您将整个文件读入了一个数组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多