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

C# 在C中搜索并替换文件中的字符串#,c#,replace,C#,Replace,我试图用C#创建一个小表单,在TMX文件(xml)中查找一个字符串,并用另一个字符串替换它。然后它将创建一个包含所有修改的输出文件。 该表单包含一个在本地磁盘中查找文件的搜索按钮和一个替换按钮,该按钮将“srclang=”all“更改为“srclang=”en US“。 到目前为止,我有以下几点: public partial class Form1 : Form { public Form1() { InitializeComponent();

我试图用C#创建一个小表单,在TMX文件(xml)中查找一个字符串,并用另一个字符串替换它。然后它将创建一个包含所有修改的输出文件。 该表单包含一个在本地磁盘中查找文件的搜索按钮和一个替换按钮,该按钮将“srclang=”all“更改为“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");
    }
    }
}
公共部分类表单1:表单
{
公共表格1()
{
初始化组件();
}
私有void Form1\u加载(对象发送方、事件参数e)
{
}
私有void openFileDialog1\u FileOk(对象发送方,CancelEventArgs e)
{
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
使用(FileDialog FileDialog=newopenfiledialog())
{
if(DialogResult.OK==fileDialog.ShowDialog())
{
字符串文件名=fileDialog.filename;
textBox1.Text=fileDialog.FileName;
}
}
}
私有无效标签1_单击(对象发送方,事件参数e)
{
}
私有无效按钮3\u单击(对象发送者,事件参数e)
{
这个。关闭();
}
私有无效按钮2\u单击(对象发送者,事件参数e)
{
StreamWriter=null;
字典替换=新字典();
替换。添加(“*全部*”,“美国”);
//…进一步替换条目。。。
使用(writer=File.CreateText(“output.txt”))
{
foreach(File.ReadLines(textBox1.Text)中的字符串行)
{
bool replacementmake=false;
foreach(替换中的var替换)
{
if(线路启动(替换键))
{
writer.WriteLine(string.Format(“{1}”),
替换。键,替换。值);
replacementmede=true;
打破
}
}
如果(!replacementmake)
{
writer.WriteLine(行);
}
}
}
替换(“output.txt”,textBox1.Text,“ORIGINAL_TMX_File.bak”);
}
}
}
这段代码来自DaveR。在这个网站上,它确实可以处理TXT文件,但我不确定我做错了什么。我在这里完全是个新手。
如果有人能帮我写几行让它工作,我会非常感激

我想我理解您的意图,以下部分是您代码的精髓:

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开始)。

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

如下例所示:

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

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

如果是xml,您真的想使用C的xml功能#您可以发布一个需要替换的xml文件部分的示例吗?嗨,Chris,我需要更改标题中的字符串(srclang=“all”for srclang=“en-US”):感谢大家的帮助:-)