Bonjour a vous tous !
Je développe pour mon amusement un petit projet de synchro de srt avec l' activeX de vlc sous VS2010, et j' import donc des fichiers SRT

Une première version lie le fichier ligne par ligne et utilise des boucles while suivie de String.Split ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
StreamReader reader = new StreamReader(fichier, System.Text.Encoding.Default);
            while ((ligne = reader.ReadLine()) != null)
            {
                try
                {
 
                    if (utils.IsNumeric(ligne) == true && item != string.Empty)
                    {
 
                        string[] splititem = item.Split(new string[] { "\n", "-->", "\n", }, System.StringSplitOptions.None);
 
                        int item_numero = Convert.ToInt32(splititem[0]);
                        string item_debut = splititem[1];
                        string item_fin = splititem[2];
 
                        string item_texte = null;
                        for (int i = 3; i < splititem.Count(); i++)
                        {
                            item_texte += splititem[i] + "\n";
                        }
                        item_texte = utils.RemoveEmptyLines(item_texte);
 
                        table.Rows.Add(item_numero, Convert.ToString(utils.hours_from_milliseconds(Convert.ToDouble(utils.milliseconds_from_hours(item_debut)) + append_time)), Convert.ToString(utils.hours_from_milliseconds(Convert.ToDouble(utils.milliseconds_from_hours(item_fin)) + append_time)), utils.milliseconds_from_hours(item_debut) + append_time, utils.milliseconds_from_hours(item_fin) + append_time, item_texte);
                        item = null;
                        item += ligne + "\n";
 
                        table.Rows.Add(match.Groups["sequence"].Value,
                            Convert.ToString(utils.hours_from_milliseconds(Convert.ToDouble(utils.milliseconds_from_hours(match.Groups["start"].Value)) + append_time)),
                            Convert.ToString(utils.hours_from_milliseconds(Convert.ToDouble(utils.milliseconds_from_hours(match.Groups["end"].Value)) + append_time)),
                            utils.milliseconds_from_hours(match.Groups["start"].Value) + append_time,
                            utils.milliseconds_from_hours(match.Groups["end"].Value) + append_time,
                            match.Groups["text"].Value);
                    }
                    else
                    {
                        item += ligne + "\n";
                    }
                }
 
            } // FIN while ..

J' ai changé en utilisant un regex qui lie tout le fichier d' un coup
Code : Sélectionner tout - Visualiser dans une fenêtre à part
private static Regex input = new Regex(@"(?<numero>\d*)\r\n(?<debut>\d{2}:\d{2}:\d{2},\d{3}) --> (?<fin>\d{2}:\d{2}:\d{2},\d{3})\r\n(?<texte>([^\n]+)\n(([^\n]+)))", RegexOptions.Compiled );
, et accède aux groupe
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 StreamReader reader = new StreamReader(fichier, System.Text.Encoding.Default);
            string fich_ = reader.ReadToEnd();
            MatchCollection matches = input.Matches(fich_);
 
 
            foreach (Match match in matches)
            {
 
                table.Rows.Add(
                               match.Groups["numero"].Value,
                              Convert.ToString(utils.hours_from_milliseconds(Convert.ToDouble(utils.milliseconds_from_hours(match.Groups["debut"].Value)) + append_time)),
                              Convert.ToString(utils.hours_from_milliseconds(Convert.ToDouble(utils.milliseconds_from_hours(match.Groups["fin"].Value)) + append_time)),
                              utils.milliseconds_from_hours(match.Groups["debut"].Value) + append_time,
                              utils.milliseconds_from_hours(match.Groups["fin"].Value) + append_time,
                              utils.RemoveEmptyLines(match.Groups["texte"].Value)
                              );
 
            }
Les deux fonctionnent, mais en rapidité sont ex-arquo .. en lenteur...

Mes fonctions perso de la classe utils reformattent les données
"hh:mm:ss:mmm" en ms ou inversement ...
J' ai essayé de voir si elles sont en cause en les enlevant juste pour voir mais c' est toujours aussi lent ...

Pour indication, je compte environ 10 sec. pour ouvrir un fichier de 2000 sous-titres,

Je suis simple amateur, peut -être suis-je à coté de la plaque niveau stratégie ...

Sinon, ca existe des parseurs pareils en "tout fait" ?

Merci pour vos lumières ...