Лучший способ добавить пробелы между двойными точками с запятой - PullRequest
6 голосов
/ 12 февраля 2020

Моя задача проста: у меня есть файл CSV внутри строки C#, разделенный точками с запятой. Мне нужно добавить пробелы для каждой пустой ячейки. A;B;;;;C; должно стать A;B; ; ; ;C;. Прямо сейчас я использую метод замены дважды:

csv = csv.Replace(";;", "; ;").Replace(";;", "; ;");

Это необходимо, потому что в первом проходе он заменит любое вхождение ;; с пробелом между ними, но обратного просмотра нет, поэтому вторая точка с запятой замененной последовательности больше не будет проверяться. Поэтому я получу A;B; ;; ;C;, а это не то, что я хочу.

Есть ли более элегантный, понятный и менее излишний и способ решить эту задачу?

Ответы [ 2 ]

9 голосов
/ 12 февраля 2020

Одним из способов является использование регулярных выражений.

using System.Text.RegularExpressions;

var result = Regex.Replace("A;B;;;;C;", ";(?=;)", "; ");

Мы заменяем каждую точку с запятой, за которой следует другая точка с запятой, строкой "; ".

Это определенно менее избыточно, и это ясно, если вы знаете, как читать регулярные выражения :) Решите, будет ли он более элегантным.

9 голосов
/ 12 февраля 2020

Вы можете попробовать Split строку в деталях, а затем заменить пустые записи пробелами, используя Select (для этого требуется using System.Linq;) и Join записей назад

var str = "A;B;;;;C";
var parts = str.Split(';').Select(p => string.IsNullOrEmpty(p) ? " " : p);

var result = string.Join(";", parts);

Результатом будет следующий A;B; ; ; ;C

Результат сравнения по сравнению с кодом OP и решением Regex:

enter image description here

Какое четкое и элегантное решение зависит от вас. Контрольный код для справки ниже

[SimpleJob]
public class Benchmark
{
    string input= "A;B;;;;C";

    [Benchmark]
    public string SplitJoinTest()
    {
        var parts = input.Split(';').Select(p => string.IsNullOrEmpty(p) ? " " : p);
        return string.Join(";", parts);
    }

    [Benchmark]
    public string DoubleReplaceTest()
    {
        return input.Replace(";;", "; ;").Replace(";;", "; ;");
    }

    [Benchmark]
    public string RegexTest()
    {
        return Regex.Replace(input, ";(?=;)", "; ");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...