此文件說明如何建立、編輯使用於文創產調視覺化之資料檔案。首先,您可能會最關心的應該就是「檔案格式」跟「編輯軟體」了:

文化內容策進院之「文創產調視覺化」( 後稱產調視覺化 ) 為一線上網站,使用 JavaScript 即時載入並繪製資料檔成互動圖表。
為了方便直接透過線上程式讀取,資料檔格式以 CSV ( 逗號分格數值 ) 格式為主,可以透過試算表軟體 ( 如 Google Spreadsheet 與 Microsoft Excel ) 中編輯後匯出。此份文件將著重在試算表中資料的編排方式,不會涉及到檔案格式等較低階的細節。
要編輯此類檔案,您僅需要準備 Microsoft Excel 或 Google Spreadsheet 等軟體;若牽涉到軟體使用的部份,此文件將以 Google Spreadsheet 做為示範工具,但兩者的概念大多通用,若您希望使用 Microsoft Excel 或其它相似的軟體,您可將文件說明的部份類推至您的軟體上使用。

此文件分為以下章節:
為了讓程式能夠順利讀取您的資料,您的資料必須要「結構化」。結構化不容易簡單說明,但大致上,資料必須要有一致性,避免混雜排版、自然語言等資訊,並且盡量將複合性的資訊分開記載。
為方便接下來的說明,我們簡單描繪一下表格的長相。如下圖:
以下例來說,左表在數字中混雜了文字、縮寫跟單位,缺乏一致性;中表在數字中使用文字加註說明;右表在同一個欄位中記載兩組資料:
改進的方式並不難,首先統一格式,接著抽離單位,最後將混合欄位分開:
由於大多數的資料都有單位的概念,因此上表此類「標頭 ( header ) + 資料 ( body ) 」的基本格式可說是我們表格的最基本格式。
又或者,下表某真實案例中,記載各類型廣播電臺的涵蓋電臺,等於將多組資料寫在單一儲存格中,並用頓號排板,前後文結構又不一致,程式無法正確分析:
以上例來說,我們可以做以下改進:
調整後的資料表如下:
為了將各筆資料明確分割,嚴禁使用合併儲存格。的確,由於統計上的困難,有時無法準確的將資料切分開來,然而這樣的資料就算您做成了資料檔,程式也是無法呈現。
為了盡量呈現您手中的資料,您可以選擇:
依上述的結構化要求,一個最基本的資料表格如下:
最後,請確保單一檔案僅包含一個表格。如果您有多組表格,只要無法合理併成一個表格,就應該另外存成獨立的檔案,避免程式無法正確解析。
除了一般結構化的概念,我們還必須要考慮到程式的特定用途,在此處即為「產調視覺化」線上圖表繪製的用途。為了生成圖表,我們需要以下資訊:
一般來說,這些資訊通常會使用程式常見的專用格式來儲存 ( 如 JSON 或 XML ),但由於此類文件通常較不容易讓一般人編輯,但一般較容易編輯的 Microsoft Excel 檔案卻又過於一般性,沒有這些資訊的規範,因此我們必須明確規定如何在試算表檔案中加入這些資訊,並請編輯人員遵照規定編輯試算表檔案。
首先,在一個普通的試算表中,我們在上面保留 7 行用以記載額外的資訊;第 8 行以後則為單純的資料區域。前 7 行資料又分為「表格」與「欄位」的中介資訊:
以圖像化的方式來呈現:
以下以一個假想案例來做範例: ( 注意前兩行我們僅用到第一欄的儲存格。第二欄以後的儲存格因為未定義用途,應保持空白 )
如同在前文中所提到的,我們禁止在單一檔案放多個表格。
每個資料檔僅能含有一個表格,再強調一次,不得將多組資料記載在同一份資料表中。
下圖為一錯誤的示範,將多個表格拼貼在一個試算表中,其中包括「電影放映業」、「電影後製特效業」等兩產業,又分別將兩產業各年度之資料分不同表格記載:

當多重表格混合在一起時,程式完全無法知道該如何判讀資料,也因此這樣的資料只能透過人工使用,無法輸入程式使用,這也是為什麼我們不應該這樣整理資料。
然而,分成多檔案有時會讓整理資料變得相當不容易。為方便管理, 我們可以將多個表格以 不同工作簿 的形式儲存在同一個試算表檔案中;只要將相關的資料放在同一個試算表中,資料整理或檔案管理都會變得相對容易。下圖展示了使用 Google Spreadsheet 做多重表格管理的範例,各個工作簿以表格標題命名,內容則依上述資料表結構編排:

由於程式使用資料時是以單一 CSV 檔為單位,而 CSV 檔並不支援工作簿的概念,我們仍需要將工作簿輸出成多個 CSV 檔,才能供給程式使用。資料表數量眾多,手工逐一輸出資料較費時,因此這時我們可以使用輔助程式如 VBA 或 Script Tool 來協助我們自動生成 CSV 檔。
輔助程式屬編輯軟體操作的範疇,並非此文件所涵蓋的範圍,但相關教學可以在網路上找到,這裡附上一個用於 Google Spreadsheet 的工具程式,可協助我們生成所有工作簿的 CSV 壓縮檔:
/*
* script to export data in all sheets in the current spreadsheet as individual csv files
* files will be named according to the name of the sheet
* author: Michael Derazon
*/
function onOpen() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var csvMenuEntries = [{name: "export as csv files", functionName: "saveAsCSV"}];
ss.addMenu("csv", csvMenuEntries);
};
function saveAsCSV() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheets = ss.getSheets();
// create a folder from the name of the spreadsheet
var folder = DriveApp.createFolder(ss.getName().toLowerCase().replace(/ /g,'_') + '_csv_' + new Date().getTime());
for (var i = 0 ; i < sheets.length ; i++) {
var sheet = sheets[i];
// append ".csv" extension to the sheet name
fileName = sheet.getName() + ".csv";
// convert all available sheet data to csv format
var csvFile = convertRangeToCsvFile_(fileName, sheet);
// create a file in the Docs List with the given name and the csv data
folder.createFile(fileName, csvFile);
}
Browser.msgBox('Files are waiting in a folder named ' + folder.getName());
}
function convertRangeToCsvFile_(csvFileName, sheet) {
// get available data range in the spreadsheet
var activeRange = sheet.getDataRange();
try {
var data = activeRange.getValues();
var csvFile = undefined;
// loop through the data in the range and build a string with the csv data
if (data.length > 1) {
var csv = "";
for (var row = 0; row < data.length; row++) {
for (var col = 0; col < data[row].length; col++) {
if (data[row][col].toString().indexOf(",") != -1) {
data[row][col] = "\"" + data[row][col] + "\"";
}
}
// join each row's columns
// add a carriage return to end of each row, except for the last one
if (row < data.length-1) {
csv += data[row].join(",") + "\r\n";
}
else {
csv += data[row];
}
}
csvFile = csv;
}
return csvFile;
}
catch(err) {
Logger.log(err);
Browser.msgBox(err);
}
}
此程式需透過 Google Spreadsheet 的 Script Editor ( 選單 → 工具/Tool → 指令碼編輯器/Script Editor ),關於使用 Script Editor 的教學,請另參考 Google Spreadsheet 的使用文件。
有時候,即便我們已經依照上述方式來整理資料,仍不免將資訊藏進欄位名稱中,減損了資料可再利用性。
比方說,下表利用多個欄位分「年度」來呈現「產值」這個數據,由於「年度」之值儲存在欄位中,並沒有對應的描述性資料 ( 年度的資料分類、單位等資訊都缺失了 ),我們在利用資訊時就變得更為侷限;此外,「產值」的概念也被混進年度之中,更難正確的解析:
這裡我們應考慮將欄位重新匯整成單一欄位,並將資料做對應的轉換。此動作一般稱之為「反向樞紐 ( Unpivot )」。
以上表為例,我們先將「年度」獨立成一欄,產業別則會因年份而需要重覆輸入,如下表左。接著,再增加一欄「產值」,將「產業別 x 年份」原本對應到的數值填回此欄,如下表右。
反向樞紐後的資料表仍能透過正向樞紐轉換變成原本的形式,卻多了額外欄位的資訊,同時程式也更容易依範圍過濾、使用額外的欄位做更多樣化的資料呈現,因此較建議在編撰資料時使用此種形式的欄位規劃。
掌握正確良好的資料結構後,讓我們來看看資料數據本身。
數據有不同的型態,最常見的就是「文字」與「數字」的分野:
數字跟文字可以做的事情不太一樣。數字可以加總、平均,文字可以排序、做分類,因此若能妥善的判斷數據的類型,我們才能正確的實現資料的視覺化。
程式基本上可以自動判斷數據的類型;然而問題是當我們有多組數據時,往往會因為一些例外狀況而使得判斷數據類型變得困難。比方說,以下兩個表格中的數字完全不應該做為數字使用,但程式很難自行判讀:
也因此,我們在整理資料時,最好同時將各欄資料的類型標註在表格中,這也就是我們在「試算表結構規範」一節中,表格第四行「資料類型」的用途。然而除了「文字」、「數字」外,資料還可細分成相當多不同的種類;為了避免讓資料梳理的過程變得過度複雜,我們僅依照資料視覺化的需求,使用「NOIR 資料分類法」將資料大致上分成以下幾種:
此外, 為更精準進行視覺化, 我們進一步將 N 與 O 類資料分為下列兩種子類:
了解資料分類方式後,我們在編撰資料表時,僅需將各種資料的類型以其對應代號 ( N O I R C T ) 填入第四行之「資料類型」欄位即可。下表即為一範例,依各欄位類型填入了對應的各代碼: