在C#中搜索和替换文件中的字符串

时间:2014-03-14 19:20:58

标签: c# replace

我正在尝试在C#中创建一个小表单,以便在TMX文件(xml)中找到一个字符串,并将其替换为另一个字符串。然后它将创建一个包含所有修改的输出文件。 该表单包含一个搜索按钮,用于在本地磁盘中找到该文件,以及一个REPLACE按钮,它将更改" srclang =" all "" for" srclang =" en-US""。 到目前为止,我有以下内容:

    public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {

    }

    private void openFileDialog1_FileOk(object sender, CancelEventArgs e)
    {

    }

    private void button1_Click(object sender, EventArgs e)
    {
        using (FileDialog fileDialog = new OpenFileDialog())
        {
            if (DialogResult.OK == fileDialog.ShowDialog())
            {
                string filename = fileDialog.FileName;

                textBox1.Text = fileDialog.FileName;
            }
        }
    }

    private void label1_Click(object sender, EventArgs e)
    {

    }

    private void button3_Click(object sender, EventArgs e)
    {
        this.Close();
    }

    private void button2_Click(object sender, EventArgs e)
    {
       StreamWriter writer = null;
        Dictionary<string, string> replacements = new Dictionary<string, string>();
        replacements.Add("*all*", "en-US");
        // ... further replacement entries ...

        using (writer = File.CreateText("output.txt"))
        {
            foreach (string line in File.ReadLines(textBox1.Text))
            {
                bool replacementMade = false;
                foreach (var replacement in replacements)
                {
                    if (line.StartsWith(replacement.Key))
                    {
                        writer.WriteLine(string.Format("{1}",
                            replacement.Key, replacement.Value));
                        replacementMade = true;
                        break;
                    }
                }
                if (!replacementMade)
                {
                    writer.WriteLine(line);
                }
            }
        }

        File.Replace("output.txt", textBox1.Text, "ORIGINAL_TMX_FILE.bak");
    }
    }
}

这段代码来自Dave R.来自这个网站,它真的适用于TXT文件,但我不确定我做错了什么。我在这里完全是个新手。 如果有人可以帮我写一些线来使它工作,我真的很感激!

2 个答案:

答案 0 :(得分:1)

我想我理解您正在尝试做的事情,以下细分是您代码的精髓:

if (line.StartsWith(replacement.Key))
    {
        writer.WriteLine(string.Format("{1}",
            replacement.Key, replacement.Value));
        replacementMade = true;
        break;
    }

如果您的词典总是有一个元素,则只需更改WriteLine调用的参数即可。您只需要 替换替换值而不是整行,并对其进行替换。你可能想要像

这样的东西
writer.WriteLine(line.Replace(replacement.Key, replacement.Value)

如果要检查多个替换,请将替换的行存储在内部循环中,只在末尾写入并删除break命令。

另一个不相关的观察:WriteLine调用中的replacement.Key参数被省略,因为{1}指的是第二个附加参数(从0开始计数)。

答案 1 :(得分:1)

可能最简单的方法就是使用这些方法

如下例所示:

File.WriteAllLines(
    outputFileName,
    File.ReadAllLines(inputFileName)
        .Select(line => line.Replace(@"srclang=""en-US""", @"srclang=""all"""));

如果搜索文本中可能有空格,您可以将string.Replace的调用替换为Regex.Replace