JavaScript >> Javascript 文檔 >  >> Node.js

如何使用 Node.js 讀寫 CSV 文件

逗號分隔值(通常稱為 CSV)長期以來一直用作表示和傳輸數據的標准文本方式。在 Node.js 中讀取和寫入 CSV 文件的方法有很多。在這篇文章中,我們將學習如何使用 Node.js 以有效的方式讀取 CSV 和寫入 CSV 文件。讓我們開始吧。

更多關於 CSV #

CSV 文件是一個純文本文件,其中包含按照 CSV 標準格式化的數據。每行代表一條記錄,記錄中的每個字段使用逗號 , 的特殊字符彼此分隔 在 CSV 的情況下。用 CSV 表示表格數據很容易。以下是有關新南威爾士州郊區的 COVID-19 疫苗接種數據片段:

State,Suburb,2019 ERP population,% Vaccinated - Dose 1,% Vaccinated - Dose 2
New South Wales,Albury,"52,067",>95%,>95%
New South Wales,Armidale,"31,679",92.4%,88.9%
New South Wales,Auburn,"86,994",94.1%,91.0%
New South Wales,Bankstown,"147,237",93.3%,89.9%
New South Wales,Bathurst,"39,532",>95%,93.0%
New South Wales,Baulkham Hills,"124,066",>95%,>95%
New South Wales,Blacktown,"115,631",>95%,>95%
New South Wales,Blacktown - North,"85,385",>95%,>95%
New South Wales,Blue Mountains,"64,747",>95%,>95%
New South Wales,Botany,"45,823",>95%,>95%

CSV 文件有很多用途,其中一個突出的用途是用於數據導入和導出。即使沒有為特定的新系統創建 UI,也可以以 CSV 的形式導入數據,主要是從一些電子表格程序中取出。這可以用作將所需數據導入系統的快速入門。

同樣,CSV 非常適合從某些表格/報告中導出數據。它們充當可以在電子表格程序中打開以進行進一步數據分析的起點。毫無疑問,Node.js 可以用於解析和創建 CSV 文件,我們將在下一節中深入研究選項。

在 Node.js 中讀寫 CSV 的選項 #

有多個 NPM 包可以使用 Node.js 讀取和/或寫入 CSV 文件。最流行的是 Fast CSV,它混合了用於讀取 CSV 文件的 fast-csv/parse 和用於格式化和寫入 CSV 文件的 fast-csv/format。其他一些選項包括 csv-parser、csv-writer、neat-csv 和 csv 等等。關於下載受歡迎程度的詳細信息將在本文末尾討論。如果你感興趣的話,現在是複習一下如何在 node.js 中逐行讀取文件的好時機。

下面的所有代碼都將在 Node 14 上運行,並且希望您知道如何使用 npm install 安裝 npm 包。接下來讓我們看看如何使用 Fast CSV 讀取現有的 CSV 文件和 Node.js。

快速 CSV 讀取 Node.js 中的 CSV 文件 #

從文件系統中讀取現有的 CSV 或用戶上傳的 CSV 非常容易。在下面的示例中,我們將看到如何從文件系統中讀取一個 CSV 文件,該文件系統中包含按郊區劃分的澳大利亞所有確診 COVID-19 病例的約 85K 記錄,如下面的 CSV 文件所示:

const fs = require('fs');
const path = require('path');
const { parse } = require('fast-csv');

let rows = [];

fs.createReadStream(path.resolve(__dirname, 'confirmed_cases_au_by_location.csv'))
.pipe(parse({ headers: true }))
.on('error', error => console.error(error))
.on('data', row => {
console.log(row);
//each row can be written to db
rows.push(row);
})
.on('end', rowCount => {
console.log(`Parsed ${rowCount} rows`);
console.log(rows[81484].postcode); // this data can be used to write to a db in bulk
});

現在讓我們稍微分析一下代碼。首先,我們需要原生的 fs 和 path 模塊。然後我們需要 parse fast-csv 的函數 npm 包。之後,我們創建一個名為“rows”的空數組,我們將從 CSV 文件中讀取的所有行放入其中。

接下來,從文件中創建一個可讀流,並通過管道傳輸到標頭為 true 的 parse 函數。 headers true 值意味著從每一行解析頭部信息。如果出現任何錯誤,它會顯示在控制台中,並且在每一行上,我們都會記錄該行並將其推送到 rows 數組也是。當閱讀結束時,我們 console.log 解析的行數和 postcode 從最後一行開始。以上代碼也可以在 Github 上引用。

可以使用 Node.js 輕鬆地將這些數據寫入 MySQL、PostgreSQL 或 SQLite 數據庫。我們可以用 time node read-csv.js 運行上面的腳本 這將以以下輸出結束:

如上所示,腳本僅用了 1.87 秒即可讀取 81485 行並將它們打印到屏幕上。因此,我們將了解如何使用 Fast CSV 編寫 CSV 文件。

使用 Fast CSV 在 Node.js 中寫入 CSV #

要使用 Fast CSV 編寫 CSV 文件,我們將使用 format Fast CSV npm 模塊中包含的軟件包。下面是一個簡單的示例,我們將 80K 隨機行寫入一個測試 CSV 文件,該文件也可能是從數據庫中提取的數據:

const fs = require('fs');
const { format } = require('@fast-csv/format');
const fileName = 'randoms.csv';
const csvFile = fs.createWriteStream(fileName);

let randoms = [];
const min = 1;
const max = 90000;
const noOfRows = 80000;
const stream = format({ headers:true });
stream.pipe(csvFile);

for(i=0; i<noOfRows; i++) {
randoms.push({
characters: Math.random().toString(36).substr(2, 7),
number: Math.floor(Math.random() * (max - min + 1) + min)
});
stream.write(randoms[i]);
}

console.log(randoms[79999].number);//with randoms array, all data could have been written at the end too
stream.end();
console.log(`${fileName} written with stream and ${noOfRows} rows`);

進一步檢查代碼後,我們可以找出正在執行的操作。首先,需要本機文件系統 (fs) 模塊。然後,fast-csv/format中的格式化方法 也包括在內。隨後,我們定義了兩個變量,一個是文件名,另一個是指向 CSV 文件的可寫流。

因此,我們定義了更多的常量,它們將幫助我們生成一個包含 80K 隨機字符串和數字的隨機對像數組,如上述循環所示。在生成數字之前,我們將 CSV 流通過管道傳輸到 csvFile,這意味著每次我們向 CSV 流寫入任何內容時,它也會被寫入文件。

最後,我們通過控制台記錄最後一行的隨機數並結束流。然後我們還控制台記錄示例 CSV 文件的文件名和行數。上面的文件也可以在 Github 上找到。

當我們使用 time node write-csv.js 運行上述腳本時 它呈現以下輸出:

如上所示,該腳本只用了 0.52 秒來編寫一個包含 80K 行和隨機生成值的 CSV 文件。由於使用了流,它也很快。

以上所有代碼都可以作為公共 GitHub 存儲庫供您參考。

Fast CSV 肯定不是解析和編寫 CSV 的唯一包,還有其他包。對 5 個流行的 CSV 包的 NPM 趨勢進行快速比較,結果如下:

Fast CSV 每周有超過 900K 的下載量,這是在 Node.js 中使用 CSV 的最受歡迎的選項之一。此處未進行比較的 CSV 解析每周有超過 180 萬次下載,儘管如此,它不像 Fast CSV 那樣易於使用,但肯定還有許多其他功能。選擇合適的包可以根據項目的需要而定。

結論#

我們已經了解瞭如何使用 Node.js 和 Fast CSV npm 模塊來讀取和寫入 CSV 文件。總共不到 50 行代碼,我們可以在 2 秒內使用 Node.js 讀取和寫入較大的 CSV 文件,非常棒。


Tutorial JavaScript 教程
  1. 如何控制 ReactJS MUI 表格列的高度和寬度

  2. MazeBattles.com:允許用戶與他們的朋友比賽以解決生成的迷宮的網站 (NodeJS)

  3. React.js 中的 Mapbox 和工具提示

  4. 如何防止 Vue 上的 Chrome 表單自動填充?

  5. 無法在mounted() 中調用函數

  6. 3. 按值和引用訪問

  7. #10 - 有效間距 CodeWars Kata (7 kyu)

  1. 構造函數簡介

  2. 簡單的算法反向

  3. React 中的 Vuex

  4. 使用您的大腦 - 追求可發現性

  5. mirkan1 Twilio x Dev Hackathon 提交#TwilioHackathon

  6. 為什麼要混音💿?

  7. 如何在 JavaScript 中使用五位長的 Unicode 字符

  1. 介紹 Vorlon.js:如何使用它來遠程調試 Javascript

  2. JavaScript 中的函數作用域和塊作用域 |基本

  3. 管理您的待辦事項列表的 Twitter 機器人

  4. 聲明式編程和反應