سؤال

ما هو أفضل وسيلة للكتابة خط معين في الملف؟ أريد أساسا للبحث في الملفات عن السلسلة "parsethis" والكتابة بقية هذا الخط مع شيء آخر.

هل كانت مفيدة؟

المحلول

إذا لم يكن الملف كبير جدا، فإن أفضل طريقة ربما يكون لقراءة الملف إلى مجموعة من خطوط مع ملف () أو البحث من خلال مجموعة من خطوط سلسلة الخاص بك وتحرير هذا الخط، ثم تنهار () مجموعة معا مرة أخرى و fwrite () مرة أخرى إلى الملف.

نصائح أخرى

وإذا كان الملف كبير حقا (ملفات السجل أو شيء من هذا القبيل) وكنت على استعداد للتضحية من اجل سرعة استهلاك الذاكرة التي يمكن أن تفتح الملفين وأساسا تفعل خدعة <لأ href = "https://stackoverflow.com/ أسئلة / 235604 / overwite الخط في ملف مع-فب # 235610 "> جيريمي Ruten والمقترحة باستخدام الملفات بدلا من ذاكرة النظام.

$source='in.txt';
$target='out.txt';

// copy operation
$sh=fopen($source, 'r');
$th=fopen($target, 'w');
while (!feof($sh)) {
    $line=fgets($sh);
    if (strpos($line, '@parsethis')!==false) {
        $line='new line to be inserted' . PHP_EOL;
    }
    fwrite($th, $line);
}

fclose($sh);
fclose($th);

// delete old source file
unlink($source);
// rename target file to source file
rename($target, $source);

والمشكلة الرئيسية الخاصة بك هو حقيقة أن الخط الجديد قد لا يكون بنفس طول الخط القديم. إذا كنت بحاجة إلى تغيير طول الخط، وليس هناك طريقة للخروج من إعادة كتابة ما لا يقل عن الملف بعد السطر تغير. أسهل طريقة لإنشاء ملف جديد أو تعديل ومن ثم نقله عبر الأصلي. بهذه الطريقة كان هناك ملف كامل متاح في جميع الأوقات للقراء. استخدام قفل للتأكد من أن برنامج نصي واحد فقط يتم تعديل ملف في وقت واحد، ومنذ كنت تسير على استبدال الملف، لا قفل على ملف مختلف. تحقق من flock().

إذا كنت متأكدا من أن الخط الجديد سيكون نفس طول الخط القديم، يمكنك فتح الملف في قراءة الوضع / الكتابة (استخدام r+ كما الوسيطة الثانية إلى fopen()) وندعو ftell() لإنقاذ الموقف الخط يبدأ في كل مرة قبل استدعاء fgets() قراءة سطر. بمجرد العثور على السطر الذي تريد الكتابة، يمكنك استخدام fseek() أن أعود إلى بداية السطر وfwrite() البيانات الجديدة. طريقة واحدة لإجبار خط لتكون دائما بنفس الطول هو وسادة الفضاء بها إلى أقصى طول ممكن.

وأو إذا كان الملف الخاص بك ليست كبيرة جدا:

$sample = file_get_contents('sample');
$parsed =preg_replace('#@parsethis.*#', 'REPLACE TO END OF LINE', $sample);

وسيكون لديك لاختيار المحددات '#' التي ليست موجودة في ملف بالرغم من ذلك.

وهذا هو الحل الذي يعمل لإعادة كتابة سطر واحد فقط من ملف في مكان مع الحوار الاقتصادي الاستراتيجي من PHP. يحتوي الملف الخاص بي فار النمط فقط، ويتم تنسيق: $ styleVarName: styleVarProperty؛ \ ن
لهذا أنا أولا إضافة ":" إلى أقاصي myStyleVarName، والحوار الاقتصادي الاستراتيجي يحل محل بقية هذا الخط مع خاصية جديدة، ويضيف فاصلة منقوطة. تأكد وهرب الأحرف المؤكد صحيح في myStyleVarProp.

$command = "pathToShellScript folder1Name folder2Name myStyleVarName myStyleVarProp";
shell_exec($command);

/* shellScript */
#!/bin/bash
file=/var/www/vhosts/mydomain.com/$1/$2/scss/_variables.scss
str=$3"$4"
sed -i "s/^$3.*/$str;/" $file

إذا كنت تريد استبدال تماما محتويات ملف واحد مع محتويات ملف آخر يمكنك استخدام هذا:

rename("./some_path/data.txt", "./some_path/data_backup.txt");
rename("./some_path/new_data.txt", "./some_path/data.txt");

وحتى في السطر الأول لك نسخة احتياطية من ملف وفي السطر الثاني الذي يحل محل الملف مع محتويات ملف جديد.

وبقدر ما استطيع ان اقول إعادة تسمية بإرجاع منطقية. صحيح إذا كان إعادة تسمية ناجحة وكاذبة إذا فشلت. ويمكن للمرء، لذلك، فقط تشغيل الخطوة الثانية إذا كانت الخطوة الأولى هي ناجحة لمنع الكتابة فوق الملف إلا إذا تم إجراء النسخ الاحتياطي بنجاح. راجع:

https://www.php.net/manual/en/function .rename.php

وعلى أمل أن يكون مفيدا لشخص ما.

وهتاف

وأدريان

وكنت على الأرجح أن تفعل ما اقترح جيريمي، ولكن فقط عن وسيلة بديلة للقيام بذلك هنا هو حل آخر. لم يتم اختباره هذا أو المستخدمة ولأنظمة لا شىء *.

$cmd = "grep '@parsethis' " . $filename;
$output = system($cmd, $result);
$lines = explode("\n", $result);
// Read the entire file as a string
// Do a str_repalce for each item in $lines with ""
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top