C # Разбор строки - PullRequest
       15

C # Разбор строки

5 голосов
/ 09 мая 2011

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

mc_gross = 22.99invoice = ff1ca57d9fa80cf93e6b300dd7f063e1protection_eligibility = Inelitableaddress_status = подтвержденныйpayer_id = SGA8X3_state15, 2010 PSTpayment_status = Completedcharset = окна-1252address_zip = 98045first_name = jackobmc_fee = 1.08address_country_code = USaddress_name = джон martinnotify_version=3.0custom=ff1ca5asdf7d9fa80cf93e6b300dd7f063e1payer_status=unverifiedbusiness=gold-me@hotmail.comaddress_country=United Statesaddress_city = север bendquantity = 1verify_sign = AZussRXZRkuk7frhfirfxxTkj0BDJGA2dJF3eF263eEsjLixS.xRxCzfaYLpayer_email =мне @ gmail.comtxn_id = 4DU53818WJ271531Mpayment_type = instantlast_name = Martinaddress_state = WAreceiver_email = cravbill @ hotmail.compayment_fee = 1.08receiver_id = QG8JPB4RZJGG4txn_type = web_acceptitem_name = Некоторый деталь consequenceSpecifiemc_currency = USDitem_number = G10W151residence_country = UShandling_amount = 0.00transaction_subject = ff1ca57d9fad80cf93e6b300dd7f063e1payment_gross = 22.99shipping = 0.00

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

В любом случае, любая помощь будет принята с благодарностью.

Редактировать:

Я ценю каждый пост.Мне было интересно, могу ли я сделать что-то вроде этого:

  1. Создать список тегов.ех.mc_gross=, first_name=, ...
  2. Сделайте замену в строке: thestring.replace("first_name","\r\nfirst_name") Я думаю, это даст мне перерывы, которые мне нужны для дальнейшего анализа.

Что ты думаешь?

Ответы [ 4 ]

3 голосов
/ 20 мая 2011

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

Я предполагаю, что остальные строки 60К имеют те же имена клавиш, что и одна строка сэмпла, которую вы указали? Если это так, то если кто-то не может предоставить вам список, то, по-видимому, единственный способ вручную (не программно) определить имена ключей самостоятельно.

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

Как только у вас есть список, вы можете разделить его по клавишам, а затем объединить их в новый список:

string rawData =
    "mc_gross=22.99invoice=ff1ca57d9fa80cf93e6b300dd7f063e1protection_eligibility=Ineligibleaddress_status=confirmedpayer_id=SGA8X3TX9HCVYtax=0.00address_street=155 5th ave sepayment_date=16:08:28 Nov 15, 2010 PSTpayment_status=Completedcharset=windows-1252address_zip=98045first_name=jackobmc_fee=1.08address_country_code=USaddress_name=john martinnotify_version=3.0custom=ff1ca5asdf7d9fa80cf93e6b300dd7f063e1payer_status=unverifiedbusiness=gold-me@hotmail.comaddress_country=United Statesaddress_city=north bendquantity=1verify_sign=AZussRXZRkuk7frhfirfxxTkj0BDJGA2dJF3eF263eEsjLixS.xRxCzfaYLpayer_email=me@gmail.comtxn_id=4DU53818WJ271531Mpayment_type=instantlast_name=Martinaddress_state=WAreceiver_email=cravbill@hotmail.compayment_fee=1.08receiver_id=QG8JPB4RZJGG4txn_type=web_acceptitem_name=Some item of consequenceSpecifiemc_currency=USDitem_number=G10W151residence_country=UShandling_amount=0.00transaction_subject=ff1ca57d9fad80cf93e6b300dd7f063e1payment_gross=22.99shipping=0.00";

string[] keys = {
                    "mc_gross", "invoice", "protection_eligibility", "address_status", "payer_id", "tax",
                    "address_street", "payment_date", "payment_status", "charset", "address_zip",
                    "first_name", "mc_fee", "address_country_code", "address_name", "notify_version",
                    "custom", "payer_status", "business", "address_country", "address_city", "quantity",
                    "verify_sign", "payer_email", "txn_id", "payment_type", "last_name", "address_state",
                    "receiver_email", "payment_fee", "receiver_id", "txn_type", "item_name",
                    "mc_currency", "item_number", "residence_country", "handling_amount",
                    "transaction_subject", "payment_gross", "shipping"
                };

string[] values = rawData.Split(keys, StringSplitOptions.RemoveEmptyEntries);

IEnumerable<string> parsedList = keys.Zip(values, (key, value) => key + value);

foreach (string item in parsedList)
{
    Console.WriteLine(item);
}

Это выведет данные в следующем формате:

mc_gross=22.99
invoice=ff1ca57d9fa80cf93e6b300dd7f063e1
protection_eligibility=Ineligible
address_status=confirmed
payer_id=SGA8X3TX9HCVY
tax=0.00
address_street=155 5th ave se
payment_date=16:08:28 Nov 15, 2010 PST
payment_status=Completed
charset=windows-1252
address_zip=98045
first_name=jackob
mc_fee=1.08
address_country_code=US
address_name=john martin
notify_version=3.0
custom=ff1ca5asdf7d9fa80cf93e6b300dd7f063e1
payer_status=unverified
business=gold-me@hotmail.com
address_country=United States
address_city=north bend
quantity=1
verify_sign=AZussRXZRkuk7frhfirfxxTkj0BDJGA2dJF3eF263eEsjLixS.xRxCzfaYL
payer_email=me@gmail.com
txn_id=4DU53818WJ271531M
payment_type=instant
last_name=Martin
address_state=WA
receiver_email=cravbill@hotmail.com
payment_fee=1.08
receiver_id=QG8JPB4RZJGG4
txn_type=web_accept
item_name=Some item of consequenceSpecifie
mc_currency=USD
item_number=G10W151
residence_country=US
handling_amount=0.00
transaction_subject=ff1ca57d9fad80cf93e6b300dd7f063e1
payment_gross=22.99
shipping=0.00    

Вы можете дополнительно проанализировать список, разделив каждый элемент знаком равенства ("=") или заменив исходную строку данных на строку, которая теперь содержит пропущенные разрывы строк:

string newData = parsedList.Aggregate((data, next) => data + Environment.NewLine + next);
3 голосов
/ 09 мая 2011

Если это не фиксированная ширина (очень сомневаюсь в этом), я бы сказал, что вам понадобится получить список ключевых слов, обозначающих поле.Поместите их в базу данных (SQL, XML, CSV и т. Д. - не имеет значения, где), а затем используйте их для анализа файла.Надеемся, что это произойдет в том же порядке и не пропустит никаких тегов.Если это так, создайте подстроку, которая находит значение от конца знака равенства после вашего тега до начала следующего тега в строке.Это даст вам значение, соответствующее соответствующему тегу.

Так, например, если мы возьмем только первую часть mc_gross=22.99invoice=ff1ca57d9fa80cf93e6b300dd7f063e1protection_eligibility=Ineligibleaddress_status=confirmed, наши теги будут mc_gross, invoice, protection_eligibility, and address_status Затем мы начнем с mc_gross=найдите его в строке, используя подстроку.Чтобы указать длину, мы пойдем, пока не найдем наш следующий тег invoice.Строка Substring будет сложной, но она должна выполнять свою работу.Переберите каждый тег.Когда вы доберетесь до последнего тега, вам нужно будет найти конец строки вместо другого тега.

2 голосов
/ 09 мая 2011

Изучите использование System.Text.RegularExpressions, они могут быть очень полезны.

Но простой способ сделать это - использовать функцию разбиения из строкового класса.

string head = "mc_gross=22.99invoice=ff1ca57d9fa80cf93e6b300dd7f063e1protection_eligibility=Ineligibleaddress_status=confirmedpayer_id=SGA8X3TX9HCVYtax=0.00address_street=155 5th ave sepayment_date=16:08:28 Nov 15, 2010 PSTpayment_status=Completedcharset=windows-1252address_zip=98045first_name=jackobmc_fee=1.08address_country_code=USaddress_name=john martinnotify_version=3.0custom=ff1ca5asdf7d9fa80cf93e6b300dd7f063e1payer_status=unverifiedbusiness=gold-me@hotmail.comaddress_country=United Statesaddress_city=north bendquantity=1verify_sign=AZussRXZRkuk7frhfirfxxTkj0BDJGA2dJF3eF263eEsjLixS.xRxCzfaYLpayer_email=me@gmail.comtxn_id=4DU53818WJ271531Mpayment_type=instantlast_name=Martinaddress_state=WAreceiver_email=cravbill@hotmail.compayment_fee=1.08receiver_id=QG8JPB4RZJGG4txn_type=web_acceptitem_name=Some item of consequenceSpecifiemc_currency=USDitem_number=G10W151residence_country=UShandling_amount=0.00transaction_subject=ff1ca57d9fad80cf93e6b300dd7f063e1payment_gross=22.99shipping=0.00";

string splitStrings[] = new string[2];
splitString[0] = "mc_gross";
splitString[1] = "invoice";
string headArray[] = head.Split(splitStrings, StringSplitOptions.RemoveEmptyEntries);

Вы поняли, что все разбивается на части.

0 голосов
/ 09 мая 2011

Знаки равенства - очень хороший показатель.Между знаками равенства я бы предложил использовать какой-нибудь лексический инструмент с каким-то механизмом логического вывода.

...