2009-08-07 44 views
23

Tôi cần phải xóa một dòng chính xác từ một tập tin văn bản nhưng tôi không thể cho cuộc sống của tôi tập luyện làm thế nào để đi về việc này.Xóa dòng cụ thể khỏi tệp văn bản?

Bất kỳ đề xuất hoặc ví dụ nào sẽ được đánh giá cao?

Câu hỏi liên quan

Efficient way to delete a line from a text file (C#)

+0

Làm thế nào để bạn xác định dòng này? Bởi vị trí của nó? Bởi văn bản chính xác của nó? Bởi một từ nó chứa? – Noldorin

Trả lời

39

Nếu dòng bạn muốn xóa được dựa trên nội dung của dòng:

string line = null; 
string line_to_delete = "the line i want to delete"; 

using (StreamReader reader = new StreamReader("C:\\input")) { 
    using (StreamWriter writer = new StreamWriter("C:\\output")) { 
     while ((line = reader.ReadLine()) != null) { 
      if (String.Compare(line, line_to_delete) == 0) 
       continue; 

      writer.WriteLine(line); 
     } 
    } 
} 

Hoặc nếu nó được dựa trên số dòng:

string line = null; 
int line_number = 0; 
int line_to_delete = 12; 

using (StreamReader reader = new StreamReader("C:\\input")) { 
    using (StreamWriter writer = new StreamWriter("C:\\output")) { 
     while ((line = reader.ReadLine()) != null) { 
      line_number++; 

      if (line_number == line_to_delete) 
       continue; 

      writer.WriteLine(line); 
     } 
    } 
} 
13

Cách tốt nhất để làm điều này là để mở tập tin trong chế độ văn bản, đọc từng dòng với ReadLine(), và sau đó viết nó vào một tập tin mới với WriteLine(), bỏ qua một dòng bạn muốn xóa.

Không có chức năng xóa-một-dòng-từ-tệp chung, theo như tôi biết.

+1

+1 để được tốt hơn so với bộ đệm ẩn tất cả các dòng và sau đó viết lại mà không bị xóa. –

1
  1. Đọc và nhớ mỗi dòng

  2. Xác định một trong những bạn muốn thoát khỏi của

  3. quên rằng một

  4. Viết phần còn lại trở lại trên đầu sự file

+0

Quên cái đó? Làm thế nào bạn có thể làm cho điều này xảy ra? –

7

Một cách để làm điều đó nếu các tập tin không phải là rất lớn là để tải tất cả các dòng vào một mảng:

string[] lines = File.ReadAllLines("filename.txt"); 
string[] newLines = RemoveUnnecessaryLine(lines); 
File.WriteAllLines("filename.txt", newLines); 
+0

Vâng, đây là một phương pháp đơn giản, miễn là tệp có thể được lưu trữ hoàn toàn trong bộ nhớ một cách dễ dàng. – Noldorin

+0

Chắc chắn, phương pháp này chỉ áp dụng nếu nội dung tập tin có thể vừa với bộ nhớ, nếu không phương thức "truyền trực tiếp" và tệp tạm thời phải được sử dụng như được đề xuất bởi Aric TenEyck. –

2

Bạn thực sự có thể sử dụng C# Generics cho điều này để làm cho nó thật dễ dàng:

 var file = new List<string>(System.IO.File.ReadAllLines("C:\\path")); 
     file.RemoveAt(12); 
     File.WriteAllLines("C:\\path", file.ToArray()); 
+0

Điều này sẽ không tuyệt vời như vậy đối với các tệp lớn, nhưng thông minh thì càng ít. – Gregory

+1

Sự cố là nếu tệp không thể vừa với bộ nhớ… –

0

Bạn có đang sử dụng hệ điều hành Unix không?

Bạn có thể thực hiện việc này bằng trình chỉnh sửa luồng "sed". Đọc trang hướng dẫn cho "sed"

0

Cái gì? Sử dụng tệp mở, tìm kiếm vị trí rồi dòng xóa bằng cách sử dụng null.

Gotch it? Đơn giản, dòng, không có mảng ăn bộ nhớ, nhanh chóng.

Công việc này trên vb .. văn hóa Ví dụ dòng search = id nơi văn hóa là namevalue và id là giá trị và chúng tôi muốn thay đổi nó thành văn hóa = en

Fileopen(1,"text.ini") 
    dim line as string 
    dim currentpos as long 
    while true 
    line = lineinput(1) 
    dim namevalue() as string=split(line,"=") 
    if namevalue(0)="line name value that i want to edit" then 
    currentpos=seek(1) 
    fileclose() 
    dim fs as filestream("test.ini",filemode.open) 
    dim sw as streamwriter(fs) 
    fs.seek(currentpos,seekorigin.begin) 
    sw.write(null) 
    sw.write(namevalue+"="+newvalue) 
    sw.close() 
    fs.close() 
    exit while 
    end if 
    msgbox("org ternate jua bisa, no line found") 
end while 

đó là all..use # ngày

+1

Sử dụng 4 dấu cách để thụt lề mã :) – Gregory

2

Không yêu cầu mã kích hoạt tên lửa. Hy vọng mã đơn giản và ngắn này sẽ help.

List linesList = File.ReadAllLines("myFile.txt").ToList();    
linesList.RemoveAt(0); 
File.WriteAllLines("myFile.txt"), linesList.ToArray()); 

HOẶC sử dụng this

public void DeleteLinesFromFile(string strLineToDelete) 
    { 
     string strFilePath = "Provide the path of the text file"; 
     string strSearchText = strLineToDelete; 
     string strOldText; 
     string n = ""; 
     StreamReader sr = File.OpenText(strFilePath); 
     while ((strOldText = sr.ReadLine()) != null) 
     { 
      if (!strOldText.Contains(strSearchText)) 
      { 
       n += strOldText + Environment.NewLine; 
      } 
     } 
     sr.Close(); 
     File.WriteAllText(strFilePath, n); 
    } 
0

này có thể được thực hiện trong ba bước sau:

// 1. Read the content of the file 
string[] readText = File.ReadAllLines(path); 

// 2. Empty the file 
File.WriteAllText(path, String.Empty); 

// 3. Fill up again, but without the deleted line 
using (StreamWriter writer = new StreamWriter(path)) 
{ 
    foreach (string s in readText) 
    { 
     if (!s.Equals(lineToBeRemoved)) 
     { 
      writer.WriteLine(s); 
     } 
    } 
} 
Các vấn đề liên quan