我有一个从另一个网站获取字符串的函数,如果我提取它,我最终得到以下字符串
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个字段,它们都用空格分隔。我怎样才能读取字符串并将其添加到结构和数组中以访问它们。
字段将按此设置
所以,如果我们使用" "作为一个分隔符,我们将获得7,因为第6个是一个日期时间并且之间有空格我也可以使用7,因为我可以将6和7重新组合在一起并分别存储日期和时间。
我的问题是有一种方法可以用6做或者如果我必须使用7我将如何做到这一点。我尝试过估价,但这不起作用。
我知道我的清单中的一些东西,第一个总是3个字符,第四个总是4个字符,我的记录以格式YYYY-MM-DD HH:MM:SS
格式结束日期时间为了使它更复杂一点,我发现第二个字段可以有第3个记录中的空格,如下所示" AP RETERM 007"
答案 0 :(得分: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”的系列文章,这将是一个充分的起点。
答案 1 :(得分: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#">
您只需使用生成的数组即可访问数据。
所以这就是我理解的方式