Фильтрация конкретных чисел из TXT-файла с помощью C # - PullRequest
0 голосов
/ 17 января 2019

Я пытался возиться с командной строкой AutoCAD LT в надежде связать ее с программой на C #. Я сосредоточился на командной строке, потому что есть серьезные ограничения, когда дело доходит до написания кода для релизов LT. В своем квесте я выяснил, как записывать команды в файл журнала (сохраненный в виде файла .txt).

Файл журнала:

Command: _dimlinear 
Specify first extension line origin or select object:
Specify second extension line origin:
Specify dimension line location or
[Mtext/Text/Angle/Horizontal/Vertical/Rotated]:
Dimension text = 712.75
Command: DIMLINEAR
Specify first extension line origin or <select object>: 
Specify second extension line origin: 
Specify dimension line location or 
[Mtext/Text/Angle/Horizontal/Vertical/Rotated]: 
Dimension text = 628.70

Я пытаюсь извлечь только цифры в строках, начинающихся с "Размерный текст =". Как мне добиться этого с помощью C #?

Ответы [ 5 ]

0 голосов
/ 17 января 2019

Я внес небольшое изменение в ответ, опубликованный @AnuViswan, чтобы получить каждую запись:

string str = richTextBox1.Text;
        var array = str.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
        var regex = new Regex(@"(?<Value>([+-]?(\d*\.)?\d+)+)", RegexOptions.Compiled);
        MatchCollection matches = regex.Matches(str);
        foreach (Match la in matches)
        {
            Console.writeLine(la);
        }
0 голосов
/ 17 января 2019

Вы можете сделать это с помощью Linq и Regex.

var array = str.Split(new []{Environment.NewLine},StringSplitOptions.RemoveEmptyEntries);
var regex = new Regex(@"(Dimension)\s+(text)\s+(=)\s+(?<Value>([+-]?(\d*\.)?\d+)+)",RegexOptions.Compiled);
var resultArray =  from entry in array
                let match = regex.Match(entry)
                where match.Success                
                select decimal.Parse(match.Groups["Value"].Value);

Вывод для данного примера в OP

712.75 
628.70 
0 голосов
/ 17 января 2019

Вы можете использовать File.ReadLines и LINQ, чтобы запросить файл и разбить интересующие вас строки, чтобы выбрать размеры. Я не уверен, как он будет работать, если файл огромен, но он должен работать довольно хорошо.

var logFile = File.ReadLines("your_file_path")

var dimensions = (from entry in logFile
                  where entry.StartsWith("Dimension text")
                  let parts = entry.Split(' ')
                  select decimal.Parse(parts.Last())).ToList();
0 голосов
/ 17 января 2019

Вы можете использовать регулярные выражения.

var input = @"Command: _dimlinear 
Specify first extension line origin or select object:
Specify second extension line origin:
Specify dimension line location or
[Mtext/Text/Angle/Horizontal/Vertical/Rotated]:
Dimension text = 712.75
Command: DIMLINEAR
Specify first extension line origin or <select object>: 
Specify second extension line origin: 
Specify dimension line location or 
[Mtext/Text/Angle/Horizontal/Vertical/Rotated]: 
Dimension text = 628.70
Dimension text = 628";
            var regex = new Regex( @"Dimension text = (\d+(\.\d*)?)" );
            foreach( Match match in regex.Matches( input ) ) {
                var num = decimal.Parse( match.Groups[ 1 ].Value );
                Console.WriteLine( "Num: " + num );
            }
0 голосов
/ 17 января 2019
        FileInfo fi = new FileInfo("FILE LOCATION");
        StreamReader reader = new StreamReader( fi.ToString() );
        String Line = "";
        while ( ( Line = reader.ReadLine() ) != null )
        {
            if ( !Line.Contains("Dimension text") {
                continue;
            }
            String Property = Line.Split( '=' )[0];
            String Value = Line.Substring( Property.Length + 1, Line.Length - Property.Length - 1 );
            Console.WriteLine( Value ); // This line will print value of Dimension text
        }

надеюсь, это сработает для вас.

...