讀取及寫入檔案
Tailwind Traders 應用程式需要讀取每個商店的銷售數據,然後計算總計,然後將所有個別商店銷售檔案的總計寫入新檔案。
使用 fs.readFile 從檔案讀取數據
您可以使用 fs 模組上的 readFile
方法來讀取檔案。
await fs.readFile("stores/201/sales.json");
從 readFile
方法傳回的物件是 Buffer
物件。 其中包含二進位格式的檔案內容。 例如,假設您有名為 sales.json 且具有下列內容的檔案。
{
"total": 22385.32
}
註銷 readFile
方法的傳回值會為您提供 Buffer
值。
<Buffer 7b 0a 20 20 22 74 6f 74 61 6c 22 3a 20 32 32 33 38 35 2e 33 32 0a 7d>
該結果並不實用。 您可能已讀取檔案,但您肯定無法「讀取」此資料。 但不用擔心。 JavaScript 可以將值轉換成 Buffer
字串值,以用來計算總計。 若要這麼做,只要叫用 String
物件,並傳入緩衝區即可。
const bufferData = await fs.readFile("stores/201/sales.json");
console.log(String(bufferData));
輸出如下:
{
"total": 22385.32
}
使用 JSON.parse 剖析數據
這個字串格式的資料沒有太大助益。 其仍然只是字元,但現在是您可以讀取的格式。 您希望能夠將此字串轉換成以程式設計方式存取的數據(稱為剖析數據)。
JavaScript 包含 JSON 檔案的內建剖析器。 無需其他項目即可使用。 只要使用 JSON
物件。 此外,您無須在剖析 Buffer
值之前將其轉換成字串。 JSON.parse
方法可以執行該動作。 JSON.parse 是一種常見方法,當 API 透過因特網接收資料(以字串形式)時,您會經常在 Web 開發中使用,然後需要轉換成 JSON 物件。
// read the file as string
const fileContents = await fs.readFile("stores/201/sales.json");
// turn string into JSON
const data = JSON.parse(fileContents);
// access the value by the property key `total`
console.log(data.total);
輸出如下:
22385.32
提示
檔案有各種不同的格式。 JSON 檔案因其內建的語言支援,所以最適合使用。 不過,可能會遇到 .csv、固定寬度或其他格式的檔案。 在此情況下,最好搜尋 npmjs.org 以取得該檔案類型的剖析器。
使用 fs.writeFile 將數據寫入檔案
您已在上一個練習中了解如何寫入檔案。 不同的是,您之前寫了空的檔案。 若要將資料寫入檔案,請使用相同的 writeFile
方法,但傳入想要寫入作為第三個參數的資料。
// read the file as string
const fileContents = await fs.readFile("stores/201/sales.json");
// turn string into JSON
const data = JSON.parse(fileContents);
// file name is totals.txt
const filePath = path.join("salesTotals","totals.txt");
// write the total to the "totals.json" file
await fs.writeFile(filePath, data.total);
檔案的內容 totals.txt
為:
22385.32
使用 fs.writeFile 將數據附加至檔案
在上述範例中,每次寫入檔案時,都會覆寫檔案。 有時候您想要將數據附加至檔案,而不是完全取代它。 您可以透過將旗標傳遞給 writeFile
方法來附加資料。 根據預設,旗標會設定為 w
,這表示 取代檔案。 若要改為附加至檔案,請傳遞 a
旗標,這表示 附加。
// read the file as string
const fileContents = await fs.readFile("stores/201/sales.json");
// turn string into JSON
const data = JSON.parse(fileContents);
// file name is totals.txt
const filePath = path.join("salesTotals","totals.txt");
// write the total to the "totals.json" file
await fs.writeFile(filePath, `${data.total}\r\n`, {flag: "a"});
檔案的內容 totals.txt
為:
22385.32
提示
在上述程式碼範例中,\r\n
會告訴 JavaScript 將值單獨放在一行。 若未傳遞此值 (稱為「歸位字元與換行字元」),則所有數字會全都擠在一行。
在下一個練習中,您將透過讀取所有銷售檔案,以及將總計寫入 .txt 檔案,以完成 Tailwind Traders 的銷售總額專案。 公司的商務系統接著就可以處理該檔案。