PDA

View Full Version : سوال: جایگزینی یک خط در فایلtxt



ak1_2004
دوشنبه 24 فروردین 1394, 17:08 عصر
سلام
یک فایل دارم به اینصورت :

1
2
3
4
5
.
.
.


حالا می خوام خط شماره 3 رو تبدیل کنم به عدد 2000 !!!
لطفا راهنمایی کنید .

خودم با fseek می رم به خط مربوطه و با fwrite هم می نویسم ! اما مشکلی که پیش میاد در واقع توی اون لاین نمی نویسه و رشته های بعدی رو هم حذف می کنه !!!

یعنی اینجوری می شه


1
2
2000
7
8
9


کدی که نوشتم :



<?PHP
$file = fopen("text.txt", "w+");
for ($i=0; $i < 10; $i++) {
fwrite($file, $i . PHP_EOL);
}
fclose($file);


$file = fopen("text.txt", "r+");
$data="2000";
fseek($file, 2);
fwrite($file, $data);

fclose($file);

?>


تشکر

reza_alie
دوشنبه 24 فروردین 1394, 17:27 عصر
سلام خدمت دوست عزیز
شما می تونید وقتی که فایل رو می خونید داخل یک آرایه بریزی و اونوقت توسط توابع آرایه مقدار خانه سوم را تغییر دهی
موفق باشی
یا علی

ak1_2004
دوشنبه 24 فروردین 1394, 18:24 عصر
با تشکر از دوست عزیز
کلا مشکل من این هست که چون داده ها خیلی زیاد هست می خوام به جای آرایه از فایل استفاده کنم !!
چون وقتی از آرایه استفاده می کنم برای تعداد داده های زیاد با خطای allocate memory مواجه می شم .
ممنون می شم با استفاده از توابع فایل راهنمایی بفرمایید .
تشکر

ak1_2004
سه شنبه 25 فروردین 1394, 07:34 صبح
کسی نبود ؟

j_naroogha@yahoo.com
سه شنبه 25 فروردین 1394, 08:56 صبح
این به کارت نمیاد؟ هر چند اینم همه رو یه جا میرزه توی آرایه ...


$line = 0;

while (($buffer = fgets($fh)) !== FALSE) {
if ($line == 1) {
// This is the second line.
break;
}
$line++;
}

ak1_2004
سه شنبه 25 فروردین 1394, 09:15 صبح
سلام
ممنون از جوابت
با این کار خط مربوطه پیدا می شه ! ولی من می خوام توی همون خط مربوطه به جای متن موجود متن جدیدی بنویسم !!!
مشکل اینجاست که اگر تعداد کاراکترهای متن جدید از متن قبلی بیشتر باشه می ره و روی متن خط بعد قرار می گیره !
تشکر

MMSHFE
سه شنبه 25 فروردین 1394, 09:15 صبح
function line_replace($filename, $line, $newContent) {
$currentLine = 1;
$startPos = 0;
$endPos = 0;
if(!$fp = fopen($filename, 'r')) {
return false;
}
while(!feof($fp)) {
if($str = fgets($fp)) {
$currentLine++;
if($line == $currentLine) {
$startPos = ftell($fp);
fgets($fp);
$endPos = ftell($fp);
break;
}
}
}
fclose($fp);
if($startPos > 0 && $endPos > 0) {
$content = file_get_contents($filename);
$content = substr($content, 0, $startPos) . $newContent . PHP_EOL . substr($content, $endPos);
file_put_contents($filename, $content);
return true;
}
}
line_replace('test.txt', 3, 2000);

ak1_2004
سه شنبه 25 فروردین 1394, 09:20 صبح
سلام
تست کردم به خوبی کار می کنه .
توی پروژه پیادش می کنم ببینم مشکلم رو حل می کنه .
بازم ممنون

ak1_2004
سه شنبه 25 فروردین 1394, 17:38 عصر
با سلام مجدد
تابع رو یک تغییراتی دادم برای حذف اون حلقه داخلی ! چون باعث می شه روند کار خیلی طولانی بشه و به شکل زیر در اومد .


Function LineReplace($filename, $line, $newContent) {
$line = $line
$file = new SplFileObject($filename);
$file->seek($line);
$startPos = $file->ftell();
$file->fgets();
$endPos = $file->ftell();

if($startPos >= 0 && $endPos > 0) {
$content = file_get_contents($filename);
$content = substr($content, 0, $startPos) . $newContent . PHP_EOL . substr($content, $endPos);
file_put_contents($filename, $content);
return true;
}
}


اما مشکلش این هست که خط شروعش 3 هست !
ممنون می شم یک نگاهی بندازید .