2012-10-18 32 views
1

我是C#的新手,但我需要解決一個問題。 我有幾個文件夾中的文本文件和每個文本文件有這樣的結構:C#編輯文件中的字符串 - 刪除一個字符(000)

IDNR 000000100

名稱名稱

姓姓

性別男

....等等。 ..

加載文件夾中的所有文件,這是沒問題,但我需要在IdNr中刪除「零」,所以刪除000000 100人離開那裏。保存此文件後。 每個文件有其他IDNR,因此,這是很難:(

是的,有可能每個文件手工編輯,但是當我有3000頁的文件,這是不好的:) 罐體C#一個算法,這可能這000000刪除並只留下數字100?

謝謝大家。 Vaclav

所以,謝謝大家! 但最終我有這樣的代碼:-):

using System.IO; 

命名空間名稱 { 公共部分Form1類:表格{ 公共 Form1的(){ 在InitializeComponent (); }

private void Browse_Click(object sender, EventArgs e) 
    { 
     DialogResult dialog = folderBrowserDialog1.ShowDialog(); 
     if (dialog == DialogResult.OK) 
      TP_zdroj.Text = folderBrowserDialog1.SelectedPath; 

    } 

    private void start_Click(object sender, EventArgs e) 
    { 

     try 
     { 
      foreach (string file in Directory.GetFiles(TP_zdroj.Text, "*.txt")) 
      { 
       string text = File.ReadAllText(file, Encoding.Default); 

       text = System.Text.RegularExpressions.Regex.Replace(text, "IdNr 000*", "IdNr "); 
       File.WriteAllText(file, text, Encoding.Default); 

      } 
     } 
      catch 
     { 
      MessageBox.Show("Warning...!"); 
       return; 

      } 

     { 
      MessageBox.Show("Done"); 

     } 

    } 
} 

}

謝謝大家! ;)

+2

是的,這很容易,但你有沒有嘗試過自己? –

+0

到目前爲止你做了什麼? –

回答

1

您可以使用int.Parse

int number = int.Parse("000000100"); 
String withoutzeros = number.ToString(); 

根據您的讀/保存文件的問題,做文件包含多條記錄,是頭或沒有每個記錄的鍵列表,並值如「IdNr 000000100」?沒有這些信息很難回答。

編輯:這是一個簡單而有效的方法,如果格式是嚴格的,應工作:

var files = Directory.EnumerateFiles(path, "*.txt", SearchOption.TopDirectoryOnly); 

foreach (var fPath in files) 
{ 
    String[] oldLines = File.ReadAllLines(fPath); // load into memory is faster when the files are not really huge 
    String key = "IdNr "; 
    if (oldLines.Length != 0) 
    { 
     IList<String> newLines = new List<String>(); 
     foreach (String line in oldLines) 
     { 
      String newLine = line; 
      if (line.Contains(key)) 
      { 
       int numberRangeStart = line.IndexOf(key) + key.Length; 
       int numberRangeEnd = line.IndexOf(" ", numberRangeStart); 
       String numberStr = line.Substring(numberRangeStart, numberRangeEnd - numberRangeStart); 
       int number = int.Parse(numberStr); 
       String withoutZeros = number.ToString(); 
       newLine = line.Replace(key + numberStr, key + withoutZeros); 
       newLines.Add(line); 
      } 
      newLines.Add(newLine); 
     } 
     File.WriteAllLines(fPath, newLines); 
    } 
} 
+0

對不起,..每個文件都有其他IdNr :-( – Messiah1985

+0

@ Messiah1985:新增了一個示例實現。 –

+0

謝謝!!! :-) ...「Directory.EnumerateFilesL只能Framework 4.5?所以當我有Visual Studio C# 2008年,我運氣不好:)...但這不是問題...我安裝C#2012 ..但是謝謝!! :-) – Messiah1985

0

這些都是你想採取的步驟:

  • 循環的每個文件
  • 逐行讀取文件
  • 爲每行分割「」並從第二個元素中刪除前導零
  • 寫入新線回臨時文件
  • 所有行處理後,刪除原文件並重新命名臨時文件
  • 做下一個文件

(您可以通過閱讀各避免了臨時文件的部分文件中全到內存中,但根據您的文件大小,這可能是不實際的)


你可以像這樣刪除前導零:

string s = "000000100"; 
s = s.TrimStart('0'); 
0

使用TrimStart

var trimmedText = number.TrimStart('0'); 
0

這應該這樣做。它假定您的文件具有.txt擴展名,並且會從每個文件中刪除所有出現的「000000」。

foreach (string fileName in Directory.GetFiles("*.txt")) 
{ 
    File.WriteAllText(fileName, File.ReadAllText(fileName).Replace("000000", "")); 
} 
0

簡單地說,從文件中讀取每一個令牌,並使用此方法:

var token = "000000100"; 
var result = token.TrimStart('0'); 

你可以寫類似這樣的一個功能:

static IEnumerable<string> ModifiedLines(string file) { 
    string line; 
    using(var reader = File.OpenText(file)) { 
     while((line = reader.ReadLine()) != null) { 
      string[] tokens = line.Split(new char[] { ' ' }); 
      line = string.Empty; 
      foreach (var token in tokens) 
      { 
       line += token.TrimStart('0') + " "; 
      } 
      yield return line; 
     } 
    } 
} 

用法:

File.WriteAllLines(file, ModifiedLines(file)); 
+0

我的回答對你有幫助嗎? –