首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ColdFusion (2016)循环处理电子表格数据并对输出进行分组

使用ColdFusion (2016)循环处理电子表格数据并对输出进行分组
EN

Stack Overflow用户
提问于 2018-02-19 00:54:00
回答 1查看 471关注 0票数 3

我提前为我的问题道歉!我正试图为我们的活动自动建立一份论文时间表。论文和作者的数据是在电子表格中提供的(我可怜的同事现在用电子表格手工切割和粘贴,逐行粘贴到Word文档中)。这个电子表格包含了我构建时间表所需的所有信息,以一致命名的列,但它可以是任何顺序。有点像这样(但真正的纸质标题不会被方便地编号):

代码语言:javascript
复制
Jack Doe - Co-Author - Penn State University - Aerodynamics - Aerodynamics Paper I    
John Doe - Co-Author - Penn State University - Acoustics - Acoustics Paper I
John Smith - Co-Author - University of VA - Acoustics - Acoustics Paper I
Jane Doe - Main Author - Penn State University - Acoustics - Acoustics Paper I
Bob Smith - Main Author - GA Tech - Acoustics - Acoustics Paper II
Jack Smith - Main Author - University of MD - Acoustics - Acoustics Paper III
Jill Smith - Co-Author - University of MD - Acoustics - Acoustics Paper III
Bob Doe - Main Author - Penn State University - Aerodynamics - Aerodynamics Paper I

我的目标是转换电子表格数据,以便按会话(即声学、空气动力学)、论文标题(即声学论文I、声学论文II),然后由各大学的作者对论文进行分组和排序。问题是,必须首先列出某篇论文的“主要作者”,其次是来自同一学校的合著者(如果有的话),其次是其他大学的合著者。其他合著者可以按任何顺序排列,但也必须按大学分组。

所以,以原来的例子来说,应该是这样的:

代码语言:javascript
复制
ACOUSTICS
Acoustics Paper I
Jane Doe, John Doe, Penn State University; John Smith, University of VA

Acoustics Paper II
Bob Smith, GA Tech

Acoustics Paper III
Jack Smith, Jill Smith, University of MD

AERODYNAMICS
Aerodynamics Paper I
Bob Doe, Jack Doe, Penn State University

我快到了,但我只能

代码语言:javascript
复制
ACOUSTICS
Acoustics Paper I
Jane Doe, Penn State University; John Doe, Penn State University; John Smith, University of VA;

Acoustics Paper II
Bob Smith, GA Tech;

Acoustics Paper III
Jack Smith, University of MD; Jill Smith, University of MD;

AERODYNAMICS
Aerodynamics Paper I
Bob Doe, Penn State University; Jack Doe, Penn State University;

我们使用的是2016年ACF。我正在做的事情(我的代码在下面)是读取电子表格到一个查询对象与cfspreadsheet。然后,我将输出按会话分组,然后按标题对输出进行嵌套cfoutputs。

然后,因为我想不出任何其他方法来识别每篇论文的主要作者并把它们放在第一位,所以我循环遍历该论文的所有作者,并添加一个标志来标识他们,并使用arraySort对其进行排序。请注意,我不能简单地按作者类型DESC进行排序,因为还有另一种类型,即“呈现作者”,为了简洁(ha),我省略了这个类型。有时主作者也可以是呈现作者,所以这种类型就是“主要作者呈现作者”。

无论如何,我会循环遍历排序的数组。

下面是我到目前为止尝试过的。我被困在让大学只显示一次每一位作者的名单上。我尝试在我的authorArray循环中添加另一个循环,但是我不知道索引或循环是什么,所以它只是在每个作者名称之后输出了大学名称。我尝试过使用多维数组,甚至使用查询查询来构建一个良好的有序数据结构。但我显然做错了,因为我总是因为把作者按他们的大学分组而陷入困境。

我当然会感激任何提示或提示!请注意,我不能更改最初使用此电子表格的要求。然而,一旦我得到它,我可以做任何事情,我需要的信息,以获得所需的输出。因此,我完全愿意做任何改变或重新思考我的整个方法。下面的代码是我得到的最接近的代码。

非常感谢大家提前!以下是我目前正在使用的内容:

代码语言:javascript
复制
<cfoutput query="queryPapers" group="PrimarySession">
    #PrimarySession#
    <cfoutput group="Title">
       <p>#Title#</p>
        <cfset authorArray = arrayNew(1)>
        <cfoutput>
            <cfset authorStruct = structNew()>
            <cfset authorStruct.firstName = AuthorFirstName>
            <cfset authorStruct.lastName = AuthorLastName>
            <cfset authorStruct.institution = AuthorInstitution>
            <cfset authorStruct.authorType = AuthorType>

            <cfif findNoCase("Main", AuthorType)>
                <cfset authorStruct.authorMain = "A">
            <cfelse>
                <cfset authorStruct.authorMain = "B">
            </cfif>

            <cfset arrayAppend(authorArray, authorStruct)>

            <cfscript>
                arraySort(
                    authorArray,
                    function (e1, e2) {
                        return compare(e1.authorMain, e2.authorMain);
                    }
                );
            </cfscript>
        </cfoutput>

        <cfloop index="i" from="1" to="#arrayLen(authorArray)#">
            #authorArray[i].firstName# #authorArray[i].lastName#,
            #authorArray[i].institution#;&nbsp;
        </cfloop>
    </cfoutput>
</cfoutput>

下面是上面代码的一些实际输出:

代码语言:javascript
复制
Dynamic Stall Investigations
  Sergey Smith,* University of Maryland;  Tobias Lersdorf, German University;  Pascal Marceau, University of Maryland;  

我试着去

代码语言:javascript
复制
Dynamic Stall Investigations
  Sergey Smith,* Pascal Marceau, University of Maryland;  Tobias Lersdorf, German University

非常感谢你的阅读!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-19 14:58:49

您在正确的轨道上使用您的代码,但我认为您有点过于复杂了。您可以使用下面的代码片段简化嵌套的<cfoutput>处理。

代码语言:javascript
复制
<!--- Nested output loop for displaying required result --->
<cfoutput query="queryPapers" group="PrimarySession">
    <strong>#Ucase(PrimarySession)#</strong><br />
    <cfoutput group="Title">
        <i>#Title#</i><br />
        <cfoutput group="AuthorInstitution">
            <cfoutput>
                #AuthorFirstName# #AuthorLastName#,
            </cfoutput>
            #AuthorInstitution#; <!--- display institution once per group --->
        </cfoutput>
        <br /><br /> <!--- double-space after each title group --->
    </cfoutput>
</cfoutput>
  1. 只显示大学一次的问题可以通过添加另一个级别的组嵌套并在额外嵌套组的页脚中显示来完成。
  2. 确保主作者总是第一个的问题应该在您的预处理中处理。要做到这一点,请使用现有的if/else逻辑(主作者为“A”,否则为"B“),并将其作为额外列添加到查询中。通过这种方式,可以在输出循环之前在order by子句中使用它。

更新

因此,在发布第一次修订后,我意识到有一个小的逻辑缺陷。之所以没有出现,是因为当使用上面的样本数据时,主要作者总是很方便地属于“标题”组中字母第一的大学。在看到额外的示例输出后,我意识到这一点,我将这些行添加到代码示例中,并且它也不正确地显示如下所示。

代码语言:javascript
复制
Dynamic Stall Investigations
Sergey Smith, University of Maryland; Tobias Lersdorf, German University;  Pascal Marceau, University of Maryland;

解决方案是使用现有的authorMain列(主要作者为A,否则为B ),并为属于同一主要作者的非主要作者添加另一个值A2。棘手的部分是,您必须检查另一行中的值,以确定何时设置A2。我能想到的最好的解决方案是在添加最初填充的authorMain列之后立即添加这两个代码块。

代码语言:javascript
复制
<!--- Sort query so "Main Author" is first within PrimarySession and Title --->
<cfquery name="queryPapers" dbtype="query">
    select * from queryPapers
    order by
        PrimarySession, 
        Title, 
        AuthorMain
</cfquery>

<!--- Loop through above and update NON "Main-Author" rows "A2" if they have same University as "A" rows  --->
<cfset MainInstitution = "">
<cfloop query="queryPapers">
    <cfif queryPapers.authorMain eq "A">
        <cfset MainInstitution = queryPapers.AuthorInstitution>
    <cfelse>
        <cfif MainInstitution eq queryPapers.AuthorInstitution>
             <cfset QuerySetCell(queryPapers, "authorMain", "A2", queryPapers.currentRow)>
        </cfif>
    </cfif>
</cfloop>

首先按PrimarySession、Title和AuthorMain进行排序,然后循环遍历记录集,如果非主作者与主要作者在同一所大学,则使用A2更新行,方法是使用MainInstitution变量进行跟踪。此解决方案生成适当的结果,同时允许所有其他代码保持不变。

您可以看到我的代码的第一个revision和第二个revision之间的区别,它模拟OP的场景。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48858286

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档