如何使用C#修改文本文件中的特定行?
我有srt文件,电影字幕如下: 1如何使用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
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");
}