代码之家  ›  专栏  ›  技术社区  ›  HPWD

当列表以逗号开头时在列表中查找特定实例

  •  1
  • HPWD  · 技术社区  · 6 年前

    我正在上载一个电子表格,并将电子表格列标题映射到数据库中的列标题。电子邮件列是唯一需要的列。在下面的字符串b中, ,,, 仅指示跳过/忽略了列。

    我的问题是:

    我有一个文本字符串(string a)来自一个电子表格,我需要在另一个匹配我的数据库的文本字符串(stringb)中找到它(这不是真正的值,只是为了简单地说明我的问题,所以希望这是清楚的)。

    字符串: YR,MNTH,ANNIVERSARIES,FIRSTNAME,LASTNAME,EMAIL,NOTES
    字符串B: ,YEAR,,MONTH,LastName,Email,Comments <--此列表是动态的

    MNTH 月份 有意不同;

    excelColumnList = 'YR,MNTH,ANNIV,FIRST NAME,LAST NAME,EMAIL,NOTES';  
    mappedColumnList=  ',YEAR,,MONTH,,First Name,Last Name,Email,COMMENTS';  
    mappedColumn= 'Last Name';    
    
    local.index = ListFindNoCase(mappedColumnList, mappedColumn,',', true);
    
    local.returnValue = "";
    
    if ( local.index > 0 )
    
        local.returnValue = ListGetAt(excelColumnList, local.index);
    
    writedump(local.returnValue);   // dumps "EMAIL" which is wrong
    

    我遇到的问题是当stringb以a开头时返回的索引 , 返回错误的索引值,该值稍后会影响映射。如果stringb以一个单词开头,那么这个过程将完美地工作。当stringb以a开头时,是否有更好的方法获取索引? , ?

    我也试过用 listtoarray 然后 arraytolist 清理它,但索引仍然是关闭的,我不能可靠地将+1添加到索引中以标识列表中的正确项。

    另一方面,我在考虑这个问题 mappedColumnList = right(mappedColumnList,len(mappedColumnList)-1) 删除前导 , 它仍然会丢弃我的索引值,但我可以通过向索引中添加1来解释这一点,而且乍一看这似乎是可靠的。只是担心这是一种黑客行为。

    有什么建议吗?

    https://cfdocs.org/listfindnocase

    以下是一个要点: https://trycf.com/gist/4b087b40ae4cb4499c2b0ddf0727541b/lucee5?theme=monokai

    更新 我用edit 1接受了答案。我还在这里添加了一条评论: Finding specific instance in a list when the list starts with a comma

    2 回复  |  直到 6 年前
        1
  •  2
  •   Shawn    6 年前

    如果是第一个字符,则标识并从列表中删除“”。

    编辑:更改为 while 循环以标识多个前导“,”s。

    尝试:

    while(left(mappedColumnList,1) == ",") {
        mappedColumnList = right( mappedColumnList,(len(mappedColumnList)-1) ) ;
    }
    

    https://trycf.com/gist/64287c72d5f54e1da294cc2c10b5ad86/acf2016?theme=monokai

    编辑2: 或者更好的是,如果你不介意返回Java(和一个小正则表达式),你可以完全跳过循环。超高效。

    mappedColumnList =  mappedColumnList.replaceall("^(,*)","") ;
    

    然后放下 虽然 完全循环。

    https://trycf.com/gist/346a005cdb72b844a83ca21eacb85035/acf2016?theme=monokai

    <cfscript>
    excelColumnList = 'YR,MNTH,ANNIV,FIRST NAME,LAST NAME,EMAIL,NOTES';
    mappedColumnList=  ',,,YEAR,MONTH,,First Name,Last Name,Email,COMMENTS';  
    mappedColumn= 'Last Name';    
    
    mappedColumnList =  mappedColumnList.replaceall("^(,*)","") ;
    
    local.index = ListFindNoCase(mappedColumnList, mappedColumn,',', true);
    
    local.returnValue = ListGetAt(excelColumnList,local.index,",",true) ;
    
    writeDump(local.returnValue);
    </cfscript>
    

    正则表达式的解释 ^(,*) :

    • ^ =从字符串开头开始。
    • () =捕获这组字符
    • ,* =文字逗号和所有连续重复。

    所以 ^(*) 说,从字符串的开头开始,捕获所有连续的逗号,直到到达下一个不匹配的字符。然后 replaceall() 只需将匹配字符集替换为空字符串即可。

    编辑3: 我修正了我原始答案中的错别字。我只用了一张单子。

    writeOutput(arraytoList(listtoArray(mappedColumnList))) 将除去前导逗号,但这是因为它将在成为数组之前除去空元素。这会丢弃索引,因为原始元素中有一个空元素 mappedColumnList 字符串。后面的字符串函数将读取该空元素并为其编制索引。因此,要保持索引的正常工作,您要么需要确保Excel和DB列的顺序始终相同,要么必须为每个列名创建某种映射,然后执行 ListGetAt() 在需要使用的字符串上。

        2
  •  0
  •   Dan Roberts    6 年前

    默认情况下,许多CF列表函数忽略空元素。向这些函数添加了一个标志,以便禁用此行为。如果你有绳子 ,,1,2,3 默认情况下,listToArray会考虑3个元素,但是 listToArray(listVar, ",", true) 将返回5,其中前两个为空字符串。ListGetAt具有相同的“includeEmptyValues”标志,因此当该标志设置为true时,代码应始终工作。