1

我是 C# 的菜鸟,但我需要解决一个问题。我在文件夹中有几个文本文件,每个文本文件都有这样的结构:

身份证号 000000100

姓名 姓名

姓 姓

性别男

.... ETC...

从文件夹加载所有文件,这没问题,但我需要删除 IdNr 中的“零”,所以删除 000000 和 100 留在那里。此文件保存后。每个文件都有其他 IdNr,因此,它更难:(

是的,每个文件都可以手动编辑,但是当我有 3000 个文件时,这并不好 :) C# 一种算法,这个 000000 可以删除并只留下 100 号吗?

谢谢你们。瓦茨拉夫

所以,谢谢大家! 但最后我有这个代码:-):

using System.IO;

命名空间名称 { 公共部分类 Form1 : Form { 公共 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");

        }

    }
}

}

谢谢你们 !;)

4

5 回答 5

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);
    }
}
于 2012-10-18T08:51:22.293 回答
0

这些是您想要采取的步骤:

  • 循环每个文件
  • 逐行读取文件
  • 对于在“”上分割的每一行,并从第二个元素中删除前导零
  • 将新行写回临时文件
  • 处理完所有行后,删除原始文件并重命名临时文件
  • 做下一个文件

(您可以通过将每个文件全部读入内存来避免临时文件部分,但根据您的文件大小,这可能不切实际)


您可以使用以下内容删除前导零:

string s = "000000100";
s = s.TrimStart('0');
于 2012-10-18T08:51:48.213 回答
0

使用修剪启动

var trimmedText = number.TrimStart('0');
于 2012-10-18T08:53:06.240 回答
0

这应该这样做。它假定您的文件具有 .txt 扩展名,并从每个文件中删除所有出现的“000000”。

foreach (string fileName in Directory.GetFiles("*.txt"))
{
    File.WriteAllText(fileName, File.ReadAllText(fileName).Replace("000000", ""));
}
于 2012-10-18T08:53:38.100 回答
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));
于 2012-10-18T08:53:51.933 回答