2014-11-30 5 views
1

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

IFX TMP2134567 1433010010 WT33 PARTIAL 2014-11-26 09:43:58 IFX TEMP12345 1433010003 SW80 PARTIAL 2014-11-26 09:43:10 IFX AP RETERM 007 1418310108 MB01 CONFIRMED 2014-07-03 09:48:37 

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

Поля будут созданы как этот

  1. IFX
  2. TMP2134567 (это поле может содержать пробел)
  3. WT33
  4. ЧАСТИЧНУЮ
  5. 2014-11- 26 09:43:58.

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

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

Я знаю пару вещей в моем списке, первые один всегда 3 Char, четвёртый всегда 4 гольца и моя запись заканчивается время даты в формате YYYY-MM-DD HH: MM: SS

Чтобы сделать это немного сложнее, я просто обнаружил, что у 2-го поля могут быть пробелы, как в третьей записи, которая выглядит так: «AP RETERM 007»

+2

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

ответ

1

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

<cfsavecontent variable="sampledata"> 
    IFX TMP2134567 1433010010 WT33 PARTIAL 2014-11-26 09:43:58 IFX TEM P12345 1433010003 SW80 PARTIAL 2014-11-26 09:43:10 IFX AP RETERM 007 1418310108 MB01 CONFIRMED 2014-07-03 09:48:37</cfsavecontent> 

<cfset asJson = ReReplaceNoCase(sampledata,"\s*(.{3}) (.*?) (\d+) (.{4}) ([^\s]*) (\d+-\d+-\d+ \d+:\d+:\d+)\s*",'["\1","\2","\3","\4","\5","\6"],',"ALL")> 

<!--- Replace the last comma in the generated string with a closing bracket ---> 
<cfset asJson = "[" & ReReplace(asJson,",$","]","ALL")> 

<cfset result_array = DeSerializeJSON(asJson)> 

<cfdump var="#result_array#"> 

Вы можете получить доступ к данным просто с помощью полученного массива.

Так вот, как я понимаю

  1. 3-х символов
  2. переменная строка
  3. Все цифры
  4. 4-х символов
  5. Я предполагаю, что это значение не содержит пробел
  6. Дата/время
1

Основываясь на предположении «да» на мой вопрос выше, это решение работает :

<cfscript> 
raw = " IFX TMP2134567 1433010010 WT33 PARTIAL 2014-11-26 09:43:58 IFX TEMP12345 1433010003 SW80 PARTIAL 2014-11-26 09:43:10 IFX AP RETERM 007 1418310108 MB01 CONFIRMED 2014-07-03 09:48:37"; 
recordPattern = "(\S+)\s+([\w\s]+)\s+(\d+)\s+(\S+)\s+(\S+)\s+(\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2})"; 
keys = ["a","b","c","d","e","f"]; 

records = getRecordsFromString(raw, recordPattern, keys); 
writeDump(records); 

function getRecordsFromString(raw, pattern, keys){ 
    var offset = 1; 
    var records = []; 
    while (true) { 
     var result = getRecord(raw, recordPattern, keys, offset); 
     offset = result.offset; 
     if (!offset) break; 
     arrayAppend(records, result.record); 
    } 
    return records; 
} 

function getRecord(raw, recordPattern, keys, offset){ 
    var match = reFind(recordPattern, raw, offset, true); 
    if (arrayLen(match.pos) != arrayLen(keys)+1){ 
     return {record="", offset=0}; 
    } 
    var keyIdx=1; 
    for (var key in keys){ 
     record[key] = mid(raw, match.pos[++keyIdx], match.len[keyIdx]); 
    } 
    return {record=record, offset=offset+match.len[1]}; 
} 
</cfscript> 

Очевидно, что вам нужно будет настроить recordPattern и keys в соответствии с вашими настоящими потребностями.

И если вы не понимаете использование регулярных выражений там, сделайте себе одолжение и прочитайте об этом. Я делаю серию на «regular expressions in CFML» в своем блоге, которая была бы подходящей отправной точкой.