Разделить текстовый файл, который имеет несколько строк разделения - PullRequest
3 голосов
/ 08 июля 2019

Я пытаюсь прочитать текстовый файл с разделителями пробела, а также с двойными кавычками, и это не простой способ идентифицировать этот сценарий, я просто хотел проверить, можно ли это сделать с помощью предопределенного регулярного выраженияв противном случае мне нужно начать работу над пользовательским разделением

Вот строка

"myfile-one two" "1" 3 1453454.00 -134557.63 585.0 24444.8 -999 "NULL" ""45.60 "" 67 ° 32'5.23455 "N 54 ° 56'65.3454" W "NULL" 6.00

Вывод должен быть

myfile-one two
1
3
1453454.00
-134557.63
585.0
24444.8
-999
NULL
45.60

67°32'5.23455"N
54°56'65.3454"W
NULL
6.00

ниже кода, попробуйте сначала разбить наразделитель пробела и это разделение даже в двойных кавычках, а также в виде отдельной записи

char[] space = new Char[] { ' ' };

string[] data = comp.Split(space, StringSplitOptions.RemoveEmptyEntries);

Ответы [ 2 ]

4 голосов
/ 08 июля 2019

Вы можете сопоставить любые подстроки между двойными кавычками, которые не заключены в пробелы, и захватить то, что внутри них, в именованную группу, или сопоставить любые 1+ непробельные символы и захватить в группу с одинаковыми именами и использовать

var results = Regex.Matches(str, @"(?<!\S)""(?<o>.*?)""(?!\S)|(?<o>\S+)")
                .Cast<Match>()
                .Select(m => m.Groups["o"].Value)
                .ToList();

См. Демонстрационный пример regex .

Детали шаблона

  • (?<!\S) - пробел или начало строкитребуется непосредственно слева от текущего местоположения
  • " - двойная кавычка
  • (?<o>.*?) - Группа «o»: любые 0+ символов, кроме новой строки, как можно меньше
  • " - двойная кавычка
  • (?!\S) - пробел или конец строки требуются непосредственно справа от текущего местоположения
  • | -или
  • (?<o>\S+) - Группа «o»: любые 1+ непробельных символов.

.NET позволяет использовать группы с одинаковыми именами в одном шаблоне регулярных выражений, накапливая значенияобнаружил в соответствующем буфере памяти, что вы можетеllect "via .Select(m => m.Groups["o"].Value).

0 голосов
/ 08 июля 2019

Поскольку регулярное выражение сильно влияет на производительность, а описанный сценарий довольно прост, я хотел бы предложить короткое, быстрое и свободное от регулярных выражений решение, в котором используются только члены string. Кроме того, подход без регулярных выражений гораздо более читабелен и более надежен.

// The escaped input string
var input = @"""myfile-one two"" ""1"" 3 1453454.00 -134557.63 585.0 24444.8 -999 ""NULL"" """" 45.60 """" 67°32'5.23455""N 54°56'65.3454""W ""NULL"" 6.00 ";

List<string> cleanedInputTokens = input
  .Split(new []{' '}, StringSplitOptions.RemoveEmptyEntries)
  .Select(token => token.Trim('"'))
  .ToList();

Алгоритм сначала разбивает входные данные на токены, а затем обрезает начальные и конечные заданные символы. Поскольку Split(Char[], StringSplitOptions) и Trim(Char[]) оба принимают массив символов, этот шаблон также расширяем и гибок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...