如何解析字符串的数据

时间:2014-11-30 02:58:09

标签: coldfusion coldfusion-10

我有一个从另一个网站获取字符串的函数,如果我提取它,我最终得到以下字符串

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. 1433010010
  4. WT33
  5. 2014-11-26 09:43:58。
  6. 所以,如果我们使用" "作为一个分隔符,我们将获得7,因为第6个是一个日期时间并且之间有空格我也可以使用7,因为我可以将6和7重新组合在一起并分别存储日期和时间。

    我的问题是有一种方法可以用6做或者如果我必须使用7我将如何做到这一点。我尝试过估价,但这不起作用。

    我知道我的清单中的一些东西,第一个总是3个字符,第四个总是4个字符,我的记录以格式YYYY-MM-DD HH:MM:SS

    格式结束日期时间

    为了使它更复杂一点,我发现第二个字段可以有第3个记录中的空格,如下所示" AP RETERM 007"

2 个答案:

答案 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>

显然,您需要调整recordPatternkeys以满足您的实际需求。

如果您不理解那里的正则表达式用法,请自己帮忙并阅读它。我在我的博客上写了一篇关于“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#">

您只需使用生成的数组即可访问数据。

所以这就是我理解的方式

  1. 3个字符
  2. 变量字符串
  3. 所有数字
  4. 4个字符
  5. 我认为此值永远不会包含空格
  6. 日期/时间
相关问题