Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用C#修改文本文件中的特定行?_C#_Text Files - Fatal编程技术网

如何使用C#修改文本文件中的特定行?

如何使用C#修改文本文件中的特定行?,c#,text-files,C#,Text Files,我有srt文件,电影字幕如下: 1 00:00:00082-->00:00:04352 bbb bbb bb bbb bb 2 00:00:08486-->00:00:12662 bbb bbb bbb 3 00:00:12824-->00:00:14963 bbb bbbbbb 我想将常量值添加到分钟(以便稍后显示字幕)。我该怎么做 我已经有了这个代码: class类main类 { 公共静态void Main(字符串[]args) { StringBuilder sb=新的StringBuil

我有srt文件,电影字幕如下:

1
00:00:00082-->00:00:04352
bbb bbb bb
bbb bb

2
00:00:08486-->00:00:12662
bbb bbb bbb

3
00:00:12824-->00:00:14963
bbb
bbbbbb

我想将常量值添加到分钟(以便稍后显示字幕)。我该怎么做

我已经有了这个代码:

class类main类
{
公共静态void Main(字符串[]args)
{
StringBuilder sb=新的StringBuilder();
使用(FileStream fs=newfilestream(@“sb.srt”、FileMode.Open、FileAccess.ReadWrite))
{
使用(StreamReader sr=新StreamReader(fs))
{
while(sr.Read()!=-1)
{
sb.AppendLine(sr.ReadLine());
}
}
}
}
}

我将使用与行匹配的正则表达式

00:00:08,486 --> 00:00:12,662
然后使用
Regex。用自定义的
MatchEvaluator
替换
,该工具解析时间代码,添加时间差并以字符串形式返回新的时间代码

时间代码的简单正则表达式是

"^\s*(\d\d):(\d\d):(\d\d),(\d\d\d)\s*-->\s*(\d\d):(\d\d):(\d\d),(\d\d\d)\s*$"
对于evaluator,您可以从匹配的各个字段构造两个
TimeSpan
值,添加时差并使用
string.Format
构造结果字符串

通过这种方式,您可以使用
file.ReadAllText
将整个文本文件加载到字符串中,然后使用
file.WriteAllText
对其进行处理并将其写回,这使核心例程成为一个三行程序:)


PS:不要忘记使用
RegexOptions.Multiline
选项,以使
“^”
“$”
正常工作。

这是一个完整的程序。只需将时间跨度更改为您要添加的量

const string format = @"hh\:mm\:ss\,fff";
        static void Main(string[] args)
        {
            string input = File.ReadAllText("sb.srt");
            Regex r = new Regex(@"(\d\d):(\d\d):(\d\d),(\d\d\d)");
            input = r.Replace(input, m=> AddTime(m));
            File.WriteAllText("sb.srt", input);
        }

        private static string AddTime(Match m)
        {
            TimeSpan t = TimeSpan.ParseExact(m.Value, format, CultureInfo.InvariantCulture);
            t += new TimeSpan(0, 1, 0);
            return t.ToString(format);
        }

替换
sb.AppendLine(sr.ReadLine())带有
sb.AppendLine(ProcessLine(sr.ReadLine(),60))在您的原始代码中。

您知道有数百万个程序已经在这样做了吗?大多数玩家也会这样做。问题的标题有误导性。@jv42然后更改标题,不要投票关闭我会避免
,而(sr.Read()!=-1)
在.NET中测试文件结尾,因为有更好的方法来检测它。也许在你的情况下,你只想读取整个文件,然后还有一些特殊的方法,包括一些不需要Streams和StreamReader的方法,比如
file.ReadAllText(string path)
。@奥斯卡:投票结束是因为这个问题太笼统了,比如“请为我编码这个”.在AddTime方法的第一行中,我将TimeSpan替换为DateTime,它几乎可以正常工作。对于时间跨度(0,0,1),输入:00:00:00082-->00:00:04352,输出:12:00:01082-->12:00:05352。12小时?世界跆拳道联盟?但是1秒添加正确。为什么要使用DateTime?这
是一个timespanError CS0117:
系统。TimeSpan'不包含
ParseExact'(CS0117)(sub)的定义。我有此错误,但DateTime类有ParseExact方法。现在我正在使用MonoDevelop(我不知道它是否有区别)好的,现在我在MSDN页面上看到TimeSpan有这个方法。我认为这可能是单一故障
    private static string ProcessLine(string line, int seconds)
    {
        var regex = new Regex(@"^(\d\d:\d\d:\d\d,\d\d\d) --> (\d\d:\d\d:\d\d,\d\d\d)");

        var match = regex.Match(line);

        if (match.Success)
        {
            var from = AddSeconds(match.Groups[1].ToString(), seconds);
            var to = AddSeconds(match.Groups[2].ToString(), seconds);
            return string.Format("{0} --> {1}", from, to);
        }
        else
        {
            return line;
        }
    }

    private static string AddSeconds(string timestamp, int seconds)
    {
        var datetime = DateTime.ParseExact(timestamp, "HH:mm:ss,fff", CultureInfo.InvariantCulture);
        return datetime.AddSeconds(seconds).ToString("HH:mm:ss,fff"); 
    }