Исправление плохо отформатированной строки с разделителем чисел и тысяч - PullRequest
0 голосов
/ 20 декабря 2018

Я получаю строку с числами, нулями и разделителями, которые совпадают с символами в числах.Также есть кавычки вокруг чисел, которые содержат запятую (и).В C # я хочу разобрать строку, чтобы у меня была хорошая серия чисел, разделенных каналом, без запятых, 2 десятичных знака.

Я попробовал стандартную замену, удалив некоторые строковые шаблоны, чтобы очистить его, но не могу поразить каждый случай.Сначала я удалил кавычки, но затем я получаю дополнительные числа, когда разделитель тысяч превращается в разделитель.Я попытался использовать Regex.Replace с подстановочными знаками, но не смог ничего из этого извлечь из-за множества чисел с кавычками и запятыми внутри кавычек.

изменить для Silvermind: temp = Regex.Replace (temp, "(?: \" , . * \ ")", "($ 1 = . \n) ");

У меня нет контроля над файлом, который я получаю.Я могу очистить большую часть данных.Когда строка выглядит следующим образом, возникает проблема:

703,36,751.36, «1 788,36», 887,37 891,37, «1 850,37», 843,37, «1 549 797,36», 818,36 749,36,705.36,0.00, "18,979.70", 934.37

Должен ли я искать символ кавычки, найти следующий символ кавычки, удалить запятые из всего, что находится между этими двумя символами, и двигаться дальше?Вот куда я направляюсь, но должно быть что-то более элегантное (да - я не так часто программирую на C # - я администратор).

Я хотел бы увидеть тысячиразделитель удален, и без кавычек.

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

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

internal class Program
{
    private static string testString = "703.36,751.36,\"1,788.36\",887.37,891.37,\"1,850.37\",843.37,\"1,549,797.36\",818.36,749.36,705.36,0.00,\"18,979.70\",934.37";




    private static void Main(string[] args)
    {
        bool inQuote = false;
        List<string> numbersStr = new List<string>();

        int StartPos = 0;
        StringBuilder SB = new StringBuilder();
        for(int x = 0; x < testString.Length; x++)
        {
            if(testString[x] == '"')
            {
                inQuote = !inQuote;
                continue;
            }

            if(testString[x] == ',' && !inQuote )
            {
                numbersStr.Add(SB.ToString());
                SB.Clear();
                continue; 
            }

            if(char.IsDigit(testString[x]) || testString[x] == '.')
            {
                SB.Append(testString[x]);
            }
        }
        if(SB.Length != 0)
        {
            numbersStr.Add(SB.ToString());
        }

        var nums = numbersStr.Select(x => double.Parse(x));

        foreach(var num in nums)
        {
            Console.WriteLine(num);
        }

        Console.ReadLine();
    }
}
0 голосов
/ 20 декабря 2018

Этот шаблон регулярного выражения будет соответствовать всем отдельным числам в вашей строке:

(".*?")|(\d+(.\d+)?)

  • (".*?") соответствует таким вещам, как "123.45"
  • (\d+(.\d+)?) соответствует вещам типа 123.45 или 123

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

Полный код:

  var s = "703.36,751.36,\"1,788.36\",887.37,891.37,\"1,850.37\",843.37,\"1,549,797.36\",818.36,749.36,705.36,0.00,\"18,979.70\",934.37";

  Regex r = new Regex("(\".*?\")|(\\d+(.\\d+)?)");

  List<double> results = new List<double>();
  foreach (Match m in r.Matches(s))
  {
    string cleanNumber = m.Value.Replace("\"", "");
    results.Add(double.Parse(cleanNumber));
  }

  Console.WriteLine(string.Join(", ", results));

Выход:

703.36, 751.36, 1788.36, 887.37, 891.37, 1850.37, 843.37, 1549797.36, 818.36, 749.36, 705.36, 0, 18979.7, 934.37
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...