2011-04-19 27 views
8

मेरे पास $dir नामक एक फ़ाइल है और $line नाम की एक स्ट्रिंग है, मुझे पता है कि यह स्ट्रिंग उस फ़ाइल की पूरी लाइन है लेकिन मुझे इसकी लाइन नंबर नहीं पता है और मैं इसे फ़ाइल से हटाना चाहता हूं, मुझे क्या करना चाहिए?php के साथ फ़ाइल से एक लाइन को कैसे हटाएं?

क्या यह अजीब उपयोग करना संभव है?

+0

awk एक बाहरी कार्यक्रम है, आप क्या awk के बारे में कार्यकारी या इसी तरह के समारोह – Raisen

उत्तर

7
$contents = file_get_contents($dir); 
$contents = str_replace($line, '', $contents); 
file_put_contents($dir, $contents); 
+8

दोस्त को काम नहीं किया – ibrahim

+0

मैंने प्रत्येक पंक्ति के बीच कोड लेखन गूंज की कोशिश की, फ़ाइल_पुट_कंटेंट्स फ़ंक्शन तक ठीक है, मुझे नहीं पता कि यह क्यों काम नहीं करता है: एस – ibrahim

+0

@ibrahim - आपका क्या मतलब है काम नहीं किया? क्या आप 'file_get_contents' के माध्यम से सभी सामग्री प्राप्त कर सकते हैं। मुझे बताओ कि कौन सा हिस्सा काम नहीं करता था। –

17

लाइनों को एक-एक करके पढ़ें, और मिलान फ़ाइल को दूसरी फ़ाइल में लिखें। फिर मूल फ़ाइल को प्रतिस्थापित करें।

+0

का उपयोग कर इसे कहते हैं की आवश्यकता होगी? क्या PHP में उपयोग करना संभव है? – ibrahim

+1

परेशान क्यों करें। PHP इसे अपने आप पर काफी संभाल सकता है। –

+0

इस फ़ाइल में सौ हजार लाइन हो सकती है, इसलिए मैं इसे सबसे कुशल तरीके से करना चाहता हूं :) – ibrahim

3

एक और तरीका फ़ाइल लाइन को तब तक लाइन तक पढ़ना है जब तक आपको कोई मिलान न मिल जाए, फिर उस बिंदु पर फ़ाइल को छोटा करें, और फिर शेष पंक्तियों को संलग्न करें।

+1

आप उन पंक्तियों को कैसे प्राप्त करते हैं? आपने अभी फ़ाइल को छोटा कर दिया है। –

+0

... ionno, उन्हें स्मृति में डाल दें और फिर छोटा करें .. जैसे फ़ाइल बहुत बड़ी नहीं है। यह नहीं कह रहा कि यह एक बेहतर समाधान है .. परिणामस्वरूप कम डिस्क लिखना चाहिए। – mpen

7

यह सिर्फ प्रत्येक पंक्ति को देखेगा और यदि आप इसे हटाना नहीं चाहते हैं, तो यह उस सरणी पर धक्का दिया जाता है जो फ़ाइल पर वापस लिखा जाएगा। see this

$DELETE = "the_line_you_want_to_delete"; 

$data = file("./foo.txt"); 

$out = array(); 

foreach($data as $line) { 
    if(trim($line) != $DELETE) { 
     $out[] = $line; 
    } 
} 

$fp = fopen("./foo.txt", "w+"); 
flock($fp, LOCK_EX); 
foreach($out as $line) { 
    fwrite($fp, $line); 
} 
flock($fp, LOCK_UN); 
fclose($fp); 
+1

बढ़िया! यह ठीक काम करता है –

0
इस तरह

:

file_put_contents($filename, str_replace($line . "\r\n", "", file_get_contents($filename))); 
1

यह आपको एक लाइन में सबस्ट्रिंग (ID) की तलाश में और एक नई लाइन के साथ पुरानी लाइन बदलना चाहते हैं कर रहे हैं तो भी अच्छा है।

कोड:

$contents = file_get_contents($dir); 
$new_contents= ""; 
if(strpos($contents, $id) !== false) { // if file contains ID 
    $contents_array = preg_split("/\\r\\n|\\r|\\n/", $contents); 
    foreach ($contents_array as &$record) { // for each line 
     if (strpos($record, $id) !== false) { // if we have found the correct line 
      pass; // we've found the line to delete - so don't add it to the new contents. 
     }else{ 
      $new_contents .= $record . "\r"; // not the correct line, so we keep it 
     } 
    } 
    file_put_contents($dir, $new_contents); // save the records to the file 
    echo json_encode("Successfully updated record!"); 
} 
else{ 
    echo json_encode("failed - user ID ". $id ." doesn't exist!"); 
} 

उदाहरण:

इनपुट: "123, छात्र"

पुरानी फ़ाइल:

आईडी, व्यवसाय

123, छात्र

124, ईंट परत

कोड चल रहा है करने के लिए फ़ाइल बदल जाएगा:

नई फ़ाइल:

आईडी, व्यवसाय

124, ईंट परत

0

मुझे लगता है कि फ़ाइलों के साथ काम करने का सबसे अच्छा तरीका उन्हें तारों के रूप में संपादित करना है।

पहले, फ़ाइल के सभी लाइनों (निम्नलिखित कोड संकुचित किया जा सकता है) हो:

$file = @fopen($dir, 'r'); # As you said, $dir is your filename 
if ($file) { # Ending bracket is at the end 
    if (filesize($dir)) { # Checks whether the file size is not zero (we know file exists) 
     $fileContent = fread($file, filesize($dir)); # Reads all of the file 
     fclose($file); 
    } else { 
     // File is empty 
     exit; # Stops the execution (also you can throw an exception) 
    } 
    $fileLineByLine = explode(PHP_EOL, $fileContent); # Divides the file line by line 

यहाँ, आप अपने खोज कर सकते हैं:,

$key = false; # By default, your string $line is not in the file (false) 
    foreach ($fileLineByLine as $lineNumber => $thisLine) 
     if ($thisLine === $line) 
      $key = $lineNumber; # If $line found in file, set $key to this line number 

, बस आप लाइन $ निकाल सकते हैं कुंजी + 1:

if ($key !== false) # If string $line found in the file 
     unset($fileLineByLine[$key]); # Remove line $key + 1 (e.g. $key = 2, line 3) 

अंत में, आप फाइल करने के लिए अपने परिवर्तनों को सहेजने चाहिए:

$newFileContent = implode(PHP_EOL, $fileLineByLine); # Joins the lines together 
    $file = fopen($dir, "w"); # Clears the file 
    if ($file) { 
     fwrite($file, $newFileContent); # Saves new content 
     fclose($file); 
    } 
} # Ends 'if ($file) {' above 

इसके अलावा आप एक फ़ंक्शन के रूप में कोड ऊपर सेट कर सकते हैं।

नोट्स:

  • $ लाइन \ N की तरह नए लाइन वर्ण नहीं होने चाहिए। आप उन्हें निकालना होगा:

    $line = str_replace(PHP_EOL, '', $line); 
    
  • $fileLineByLine[$key] = ""; 
    

    unset($fileLineByLine[$key]); 
    

    के बजाय

    का उपयोग न करें, क्योंकि पहले मामले लाइन को दूर नहीं करता है, यह सिर्फ लाइन को साफ करता है (और एक अवांछित खाली रेखा बनी रहेगी)। उस स्थिति में, implode() $ fileLineByLine [$ key] के लिए भी एक नई पंक्ति जोड़ता है जो खाली है; अन्यथा यदि आप एक चर को अनसेट करते हैं, तो यह अनुपलब्ध होगा (और implode() इसे नहीं ढूंढ सकता)।

0

यह awk के उपयोग के बिना हल किया जा सकता:

function remove_line($file, $remove) { 
    $lines = file($file, FILE_IGNORE_NEW_LINES); 
    foreach($lines as $key => $line) { 
     if($line === $remove) unset($lines[$key]); 
    } 
    $data = implode(PHP_EOL, $lines); 
    file_put_contents($file, $data); 
} 
+0

एसओ अजीब के बारे में पूछ रहा है। आपका उत्तर समस्या का समाधान कर सकता है, लेकिन यह समझाने की कोशिश करें कि आप इसे कैसे हल करते हैं। – Michael

संबंधित मुद्दे