これにはいくつかの解決策があります。
- ヘッダーとデータ行をメモリ内キャッシュに書き込み、フッターを書き込もうとしたときにそれらを出力します (ただし、データ行がある場合のみ、そうでない場合は何も出力しません)。
- 同じことですが、データキャッシュが大きすぎる場合に備えて一時ファイルを使用します。
- ヘッダーと、それを出力したかどうかを覚えておいてください。
最初の 2 つの解決策には非効率性 (おそらく大量のデータをキャッシュするか、比較的低速な外部ストレージを使用する) が伴うため、後者に集中します。キャッシングの方法については、下部の注を参照してください(a)。
データのキャッシュを必要としないアプローチは、ヘッダーを書き込んだかどうかを示すインジケーターを持つことです。各データ行の前に、フラグがまだ設定されていない場合にのみヘッダーを出力 (およびフラグを設定) します。このフラグを使用してフッターを制御することもできます (ヘッダーが出力されていない場合は、フッターも出力されるべきではありません)。
def outHeader (str):
headerText = str
headerSent = false
def outdata (str):
if not headerSent:
write headerText
headerSent = true
write str
def outFooter (str):
if headerSent:
write str
このソリューションは、データ キャッシュが不要であるという点で、おそらくはるかに単純です。
(a)キャッシュ ソリューションを使用したい場合(次善のソリューションであるというアドバイスにもかかわらず)、次の疑似コードはその方法を示しています。
def outHeader (str):
cachedHeader = str
cachedData = ""
def outdata (str):
cachedData = cachedData + str + "\n"
def outFooter (str):
if cachedData != "":
write cachedHeader
write cachedData
write str
そのメモリ内キャッシュとファイルベースのキャッシュの唯一の違いは次のとおりです。
- で現在作成
cachedDataしている空の一時ファイルを作成し、lineCount を 0 に設定しますoutHeader()。
str一時ファイルに送信し、 でインクリメントlineCountしoutData()ます。
lineCountキャッシュされたデータがあるかどうかを判断するために使用しoutFooter、データとして出力するために一時ファイルから行を読み戻します。