3

質問が長くなってしまいましたことをあらかじめお詫び申し上げます。イベントの論文のスケジュール作成を自動化しようとしています。紙と著者のデータはスプレッドシートで提供されます (私のかわいそうな同僚は現在、このスプレッドシートを使用して、行ごとに Word 文書に手動でカット アンド ペーストしています)。このスプレッドシートには、スケジュールを作成するために必要なすべての情報が一貫した名前の列に含まれていますが、順序は任意です。このようなものです (ただし、実際の論文のタイトルには都合よく番号が付けられません):

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)、そして各大学の著者によってグループ化および順序付けされるように、スプレッドシート データを変換することです。問題は、特定の論文の「主著者」を最初にリストし、次に同じ学校の共著者 (存在する場合)、その後に他の大学の共著者をリストする必要があることです。他の共著者の順序は任意ですが、大学ごとにグループ化する必要があります。

したがって、元の例を取ると、次のようになります。

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

私はほとんどそこにいますが、私はそれを達成することしかできません

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;

ACF 2016 を使用しています。私が行っていること (私のコードは以下) は、スプレッドシートを cfspreadsheet を使用してクエリ オブジェクトに読み込んでいます。次に、出力をセッションごとにグループ化し、ネストされた cfoutputs を使用してタイトルごとにグループ化します。

次に、各論文の主な著者を特定して最初に配置する他の方法が思いつかなかったので、その論文のすべての著者をループして、それらを識別するフラグを追加し、arraySort で並べ替えます。単純に著者タイプ DESC でソートすることはできないことに注意してください。別のタイプ「提示著者」があるためです。簡潔にするために省略しました (ha)。また、主な著者が発表者になることもあるため、そのタイプは「主な著者である発表者」になります。

とにかく、ソートされた配列をループします。

以下は、私がこれまでに試したことです。私は、大学が著者のリストごとに 1 回だけ表示されるようにすることにこだわっています。私は自分の authorArray ループに別のループを入れようとしましたが、インデックスやループの対象がわからないため、すべての著者名の後に大学名を出力するだけです。多次元配列を使用してみましたが、クエリのクエリを使用して、順序付けられた優れたデータ構造を構築しようとしました。しかし、私は明らかに間違ったやり方をしています。なぜなら、著者を大学ごとにグループ化することで困惑し続けているからです。

ヒントやヒントをいただければ幸いです。最初にこのスプレッドシートを使用するという要件を変更することはできません。ただし、一度取得すると、目的の出力を得るために必要な情報で何でもできます。ですから、私は変更を加えたり、アプローチ全体を再考したりすることに完全にオープンです。以下の私のコードは、私が得た最も近いものです。

よろしくお願いします!これが私がこれまでに使用しているものです:

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

上記のコードの実際の出力を次に示します。

Dynamic Stall Investigations
  Sergey Smith,* University of Maryland;  Tobias Lersdorf, German University;  Pascal Marceau, University of Maryland;  

そして、私は到達しようとしています

Dynamic Stall Investigations
  Sergey Smith,* Pascal Marceau, University of Maryland;  Tobias Lersdorf, German University

読んでくれてありがとう!

4

1 に答える 1