PHP fwrite()重复并替换通过fgets()获得的行

时间:2018-02-07 09:12:49

标签: php fwrite fgets

我正在尝试编写一个小的php函数,它会读取每10行,检测是否存在分号并将其替换为提交语句map_dbl

我正在使用fgets,因为该文件可能非常大,如1GB,而我不想将其保存到另一个新文件中,这会占用额外的空间。

我的功能是

$ targetFile = fopen($ file,'r +');

iris %>% nest(-Species) %>% 
  mutate(fit = map(data, ~mgcv::gam(Sepal.Width ~ s(Sepal.Length, bs = "cs"), data = .)),
         results = map(fit, glance),
         R.square = map_dbl(fit, ~ summary(.)$r.sq)) %>%
  unnest(results) %>%
  select(-data, -fit)

# A tibble: 3 x 8
  Species    R.square    df logLik   AIC   BIC deviance df.residual
  <fct>         <dbl> <dbl>  <dbl> <dbl> <dbl>    <dbl>       <dbl>
1 setosa        0.536  2.55  -1.92  10.9  17.7     3.16        47.5
2 versicolor    0.268  2.56  -3.88  14.9  21.7     3.42        47.4
3 virginica     0.191  2.28  -7.90  22.3  28.6     4.01        47.7

目标文件 执行

之前
; => into ; commit;

执行之后:

// if can open
if ($targetFile){

  $count ='';
  // loop every line
  while (($lines = fgets($targetFile)) !== false){

    $count++;

    // for line of no.10
    if( $count == '10' ){

      //if matches a semi-colon
      if( preg_match('/;/',$lines) == true ){

        // replace semi-colon with commit statement
        $insertLine = preg_replace('/;/','; commit;', $lines);

        echo file_get_contents('./1.sql'); // to debug

        fwrite($targetFile, $insertLine); // <= problem arises

        echo file_get_contents('./1.sql'); // to debug

        //reset counter
        $count = '0';
      }else{
        //lower the count to check next line
        --$count;
      }
    }
  }
}else{
  system("echo file $targetFile cannot be opened\n");
}

fclose($targetFile);

问题是为什么fwrite()会替换第11行并删除第12行

1 个答案:

答案 0 :(得分:2)

问题在于,当您使用library(quantreg) m2_boston <- rq(medv~., data=BostonHousing[i_train,], tau=0.5,method = "lasso", lambda=0.46) 迭代文件时,文件指针将继续。因此,当你到达第10行时,你的文件指针已经指向下一个,即第11行,所以你覆盖了第11行。

所以这就是我要做的事情:

Coefficients:
(Intercept)         crim           zn        indus        chas1          nox           rm          age          dis          rad 
15.528274036 -0.128622834  0.038896192  0.007109711  1.385725245 -7.221209356  5.144134214 -0.035033485 -1.075032872  0.165388801 
        tax      ptratio            b        lstat 
-0.010579964 -0.765578313  0.012533729 -0.283032080 

您可以找到一种更有效的方式来获取文件while (($lines = fgets($targetFile)) !== false)的内容,或者根据您的需要使用临时文件。