1

私は C# の新人ですが、1 つの問題を解決する必要があります。フォルダーにいくつかのテキスト ファイルがあり、各テキスト ファイルは次の構造になっています。

ID番号 000000100

名前 名前

姓 姓

セックスM

....など...

フォルダからすべてのファイルをロードします。これは問題ありませんが、IdNr の「ゼロ」を削除する必要があるため、000000 を削除して 100 を残します。このファイルを保存した後。各ファイルには別の IdNrがありました。したがって、より困難になります:(

はい、各ファイルを手動で編集することは可能ですが、3000 個のファイルがある場合、これは良くありません :) この 000000 を削除して番号 100 だけを残すことができる C# 1 つのアルゴリズムを使用できますか?

皆さん、ありがとうございました。ヴァーツラフ

それでは、ありがとうございました! しかし、最後に私はこのコードを持っています:-):

using System.IO;

名前空間名 { public partial class Form1 : Form { public 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

必要な手順は次のとおりです。

  • 各ファイルをループする
  • ファイルを 1 行ずつ読み取る
  • " " で分割された行ごとに、2 番目の要素から先頭のゼロを削除します
  • 新しい行を一時ファイルに書き戻します
  • すべての行が処理された後、元のファイルを削除し、一時ファイルの名前を変更します
  • 次のファイルを実行

(各ファイルを完全にメモリに読み込むことで一時ファイル部分を回避できますが、ファイルサイズによっては実用的ではない場合があります)


次のような方法で先行ゼロを削除できます。

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 に答える