我正在尝试编写一个小的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行
答案 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)
的内容,或者根据您的需要使用临时文件。