讀取及寫入檔案

已完成

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 的銷售總額專案。 公司的商務系統接著就可以處理該檔案。