对此有多种解决方案:
- 将标题和数据行写入内存缓存,并在您尝试写入页脚时输出它们(但前提是有数据行,否则不输出)。
- 同样的事情,但使用一个临时文件作为数据缓存,以防它太大。
- 记住标题以及您是否已输出它。
由于前两种解决方案效率低下(可能缓存大量数据,或使用相对较慢的外部存储),我将专注于后者。请参阅底部关于如何进行缓存的注释(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
内存缓存和基于文件的缓存之间的唯一区别是:
- 创建一个空的临时文件并将 lineCount 设置为 0 您当前
cachedData
在outHeader()
.
- 发送
str
到临时文件并lineCount
在outData()
.
- 用于
lineCount
确定是否有缓存数据outFooter
并从临时文件中读取行以作为数据输出。