Разбить строку на класс - PullRequest
       1

Разбить строку на класс

0 голосов
/ 13 декабря 2011

У меня есть массив, который содержит следующие значения:

str[0]= "MeterNr 29202"
str[1]="- 20111101: position 61699 (Previous calculation) "
str[2]="- 20111201: position 68590 (Calculation) consumption 6891 kWh"
str[3]="- 20111101: position 75019 (Previous calculation) "
str[4]="MeterNr 50273"
str[5]="- 20111101: position 18103 (Previous reading) "
str[6]="- 20111201: position 19072 (Calculation) consumption 969 kWh "

Я хочу разбить строки в логическом порядке, чтобы я мог сохранить их в следующем классе чтения.У меня проблемы с разделением значений.Все в скобках () это ItemDescription.

Буду благодарен за быстрый ответ.

public class Reading
{
    public string MeterNr { get; set; }

    public string ItemDescription { get; set; }

    public string Date { get; set; }

    public string Position { get; set; }

    public string Consumption { get; set; }
}

Ответы [ 3 ]

2 голосов
/ 13 декабря 2011

Я бы просто использовал для циклических и строковых индексов и т. Д., Но тогда я немного проще!Не уверен в ваших данных (например, если что-то может отсутствовать), но это сработает с данными, которые вы опубликовали ...

var readings = new List<Reading>();
int meterNrLength = "MeterNr".Length;
int positionLength = "position".Length;
int consumptionLength = "consumption".Length;
string meterNr = null;

foreach(var s in str)
{
    int meterNrIndex = s.IndexOf("MeterNr",
                                 StringComparison.OrdinalIgnoreCase);

    if (meterNrIndex != -1)
    {
        meterNr = s.Substring(meterNrIndex + meterNrLength).Trim();
        continue;
    }

    var reading = new Reading {MeterNr = meterNr};

    string rest = s.Substring(0, s.IndexOf(':'));
    reading.Date = rest.Substring(1).Trim();

    rest = s.Substring(s.IndexOf("position") + positionLength);

    int bracketIndex = rest.IndexOf('(');

    reading.Position = rest.Substring(0, bracketIndex).Trim();

    rest = rest.Substring(bracketIndex + 1);

    reading.ItemDescription = rest.Substring(0, rest.IndexOf(")"));

    int consumptionIndex = rest.IndexOf("consumption",
                                        StringComparison.OrdinalIgnoreCase);

    if (consumptionIndex != -1)
    {
        reading.Consumption = rest.Substring(consumptionIndex + consumptionLength).Trim();
    }

    readings.Add(reading);
}
2 голосов
/ 13 декабря 2011

Вы должны проанализировать значения одно за другим. Если у вас есть строка, которая начинается с «MeterNr», вы должны сохранить ее как currentMeterNumber и проанализировать значения далее. В противном случае вы можете проанализировать значения с помощью регулярных выражений:

var dateRegex = new Regex(@"(?<=-\s)(?<year>\d{4})(?<month>\d{2})(?<day>\d{2})");
var positionRegex = new Regex(@"(?<=position\s+)(\d+)");
var descriptionRegex = new Regex(@"(?<=\()(?<description>[^)]+)(?=\))");
var consuptionRegex = new Regex(@"(?<=consumption\s+)(?<consumption>(?<consumtionValue>\d+)\s(?<consumptionUom>\w+))");

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

П.С .: В Интернете много учебников.

0 голосов
/ 13 декабря 2011
public static List<Reading> Parser(this string[] str)
{
    List<Reading> result = new List<Reading>();
    string meterNr = "";
    Reading reading;
    foreach (string s in str)
    {
        MatchCollection mc = Regex.Matches(s, "\\d+|\\((.*?)\\)");
        if (mc.Count == 1)
        {
           meterNr = mc[0].Value;
           continue;
        }
        reading = new Reading()
        { 
           MeterNr = meterNr,
           Date = mc[0].Value,
           Position = mc[1].Value,
           ItemDescription = mc[2].Value.TrimStart('(').TrimEnd(')')
        };
        if (mc.Count == 4) 
            reading.Consumption = mc[3].Value;
        result.Add(reading);            
    }
    return result;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...