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

使用 node-csv 在 Node.js 中讀取和寫入 CSV 文件

簡介

一個常見的開發任務是從文件中讀取數據。常見的文件格式是 .csv 格式。

雖然您可以使用 fs 讀取 CSV 文件 Node 附帶的模塊並獲取文件的內容,在大多數情況下,借助專門為此目的製作的模塊,解析和進一步轉換會容易得多。

多個模塊提供諸如 neat-csv 之類的功能 或 csv-parser 包。但是,在本文中,我們將使用 node-csv - 一套用於生成、解析、轉換和字符串化 CSV 數據的 CSV 包。

安裝node-csv

該模塊由csv-generate組成 , csv-parse , csv-transformcsv-stringify 包。

如果您不需要全部,您可以安裝整個套件或每個包。讓我們用默認設置初始化一個 Node 項目:

$ npm init -y

然後,讓我們安裝整個node-csv 套房:

$ npm install csv

注意: 雖然該套件被稱為 node-csv - 相關的npm包其實叫csv .

我們將使用包含以下內容的 CSV 文件:

Account Name,Account Code,Type,Description
Cash,101,Assets,Checking account balance
Wages Payable,220,Liabilities,Amount owed to employes for hours not yet paid
Rent expense,560,Expenses,Cost of occupied rented facilities during accounting period

使用 csv-parse 讀取 CSV 文件

要讀取 CSV 文件,我們將使用 csv-parse 來自 node-csv 的包 .

csv-parse 包提供了多種解析 CSV 文件的方法——使用回調、流 + 回調以及同步和異步 API。我們將介紹 流 + 回調 API同步 API .

流+回調API

讓我們創建一個文件,名為 index.js 並構造一個 parser

var fs = require('fs'); 
var parse = require('csv-parse');
var parser = parse({columns: true}, function (err, records) {
	console.log(records);
});

fs.createReadStream(__dirname+'/chart-of-accounts.csv').pipe(parser);

首先,我們導入原生文件系統模塊(fs ) 和 csv-parse 模塊。然後,我們創建一個 parser 它接受一個對象文字,包含我們想要設置的選項。第二個參數是用於訪問記錄的回調函數 - 或者在我們的例子中只是將它們打印出來。

我們可以設置的選項不是強制性的。在大多數情況下,您將使用任何 delimiter , castcolumns 選項:

  • 分隔符 選項默認為逗號 , .如果您嘗試解析的文件中的數據使用了其他分隔符,例如分號 ; , 或管道 | ,您可以使用此選項指定。

  • 演員表 選項默認為 false 並用於指示您是否要將字符串轉換為它們的本機數據類型。例如,由日期字段組成的列可以轉換為 Date .

  • 選項是指示是否要以對象文字的形式生成記錄。默認情況下,此列設置為 false 並且記錄由解析器以數組的形式生成。如果設置為 true ,解析器會從第一行推斷出列名。

最後,我們使用 fs 打開了一個讀取流 模塊並開始將其通過管道傳輸到解析器中。

讓我們運行這個文件:

$ node index.js

這導致:

[
  {
    'Account Name': 'Cash',
    'Account Code': '101',
    Type: 'Assets',
    Description: 'Checking account balance'
  },
  {
    'Account Name': 'Wages Payable',
    'Account Code': '220',
    Type: 'Liabilities',
    Description: 'Amount owed to employes for hours not yet paid'
  },
  {
    'Account Name': 'Rent expense',
    'Account Code': '560',
    Type: 'Expenses',
    Description: 'Cost of occupied rented facilities during accounting period'
  }
]

例如,您可以操作這些數據,使用這些字段中的信息構造對像或將它們保存到數據庫中,而不僅僅是打印內容。

使用同步 API

讓我們使用 Sync API 複製此功能:

var fs = require('fs').promises;
var parse = require('csv-parse/lib/sync');
(async function () {
    const fileContent = await fs.readFile(__dirname+'/chart-of-accounts.csv');
    const records = parse(fileContent, {columns: true});
    console.log(records)
})();

同樣,我們正在導入 fs csv-parse 中的模塊和同步 API 模塊。

免費電子書:Git Essentials

查看我們的 Git 學習實踐指南,其中包含最佳實踐、行業認可的標準以及隨附的備忘單。停止谷歌搜索 Git 命令並真正學習 它!

然後,我們正在創建一個 async 函數,我們在其中通過 await 檢索文件的內容 readFile() 的響應 功能。

然後,我們可以創建一個parser 它將文件內容作為第一個參數,將對象文字作為第二個參數。這個對象字面量包含用於創建解析器的選項(我們設置了 columnstrue )。這個解析器被分配給一個常量變量,為了簡潔起見,我們簡單地將其內容打印出來:

[
  {
    'Account Name': 'Cash',
    'Account Code': '101',
    Type: 'Assets',
    Description: 'Checking account balance'
  },
  {
    'Account Name': 'Wages Payable',
    'Account Code': '220',
    Type: 'Liabilities',
    Description: 'Amount owed to employes for hours not yet paid'
  },
  {
    'Account Name': 'Rent expense',
    'Account Code': '560',
    Type: 'Expenses',
    Description: 'Cost of occupied rented facilities during accounting period'
  }
]

使用 CSV Stringify 編寫 CSV 文件

與閱讀類似,我們有時想 數據轉換成 CSV 格式。為此,我們將使用 csv-stringify 來自 node-csv 的包 套房。 字符串化 只是意味著我們會將一些數據(在我們的示例中為 JSON)轉換為字符串。然後將該字符串以 CSV 格式寫入文件。

假設您有一些 JSON 內容想要寫成 CSV 文件:

var someData = [
    {
        "Country": "Nigeria",
        "Population": "200m",
        "Continent": "Africa",
        "Official Language(s)": "English"
    },
    {
        "Country": "India",
        "Population": "1b",
        "Continent": "Asia",
        "Official Language(s)": "Hindi, English"
    },
    {
        "Country": "United States of America",
        "Population": "328m",
        "Continent": "North America",
        "Official Language": "English"
    },
    {
        "Country": "United Kingdom",
        "Population": "66m",
        "Continent": "Europe",
        "Official Language": "English"
    },
    {
        "Country": "Brazil",
        "Population": "209m",
        "Continent": "South America",
        "Official Language": "Portugese"
    }
]

csv-stringify 包也有幾個 API 選項,不過,Callback API 提供了一種非常簡單的方法來對數據進行字符串化,而無需像使用 Stream API 那樣處理事件。

讓我們繼續對上面的數據進行字符串化,然後再將其寫入文件:

var fs = require('fs');
var stringify = require('csv-stringify');
    
stringify(someData, {
    header: true
}, function (err, output) {
    fs.writeFile(__dirname+'/someData.csv', output);
})

在這裡,我們正在導入 fscsv-stringify 模塊。然後,使用 stringify() 函數,我們提供我們想要轉換為字符串的數據。我們還提供了一個包含 header 的對象字面量 選項。最後,還有一個回調函數,用於將內容寫入文件。

cast 等其他選項 , columnsdelimiter 也可以。在我們的例子中,我們設置 header true 的選項 告訴字符串化器在第一條記錄中生成列名。

運行此代碼會生成一個包含正確內容的文件:

結論

node-csv module 是一套較小的模塊,用於從文件讀取/解析、轉換和寫入 CSV 數據。

我們使用了 csv-parse 讀取 CSV 文件和 csv-stringify 的模塊 模塊在使用 Node.js 將數據寫入文件之前對數據進行字符串化。


Tutorial JavaScript 教程
  1. Habbo:頭像渲染基礎

  2. 在瀏覽器中運行節點模塊

  3. 如何將 toastr 模塊添加到 Angular 項目

  4. JavaScript 項目思路和實際使用

  5. 編碼 1 年🎉。這是我會回去給自己的提示

  6. GroceryJS:JavaScript 你的雜貨

  7. 構建漸進式 Web 應用程序 (PWA):沒有 React、沒有 Angular、沒有 Vue

  1. 嘗試使用 AngularJS 構建儀表板

  2. 使用 jQuery 獲取選中復選框的值

  3. 使用 Bootstrap Studio 構建 React 組件

  4. 使用 CSS 和 jQuery 在滾動上設計固定導航

  5. 時間和空間,但不是相對論:-)

  6. 為什麼我學習 Swift 而不是 React

  7. 使用 Array.Reduce 的簡單組合

  1. 🚀 GitHub 上面向 Web 開發人員的 10 個熱門項目 - 2021 年 7 月 9 日

  2. 國際化您的鍵盤控制

  3. 在 Shingeki no Kyojin 的幫助下,JavaScript 中的原型繼承

  4. 編寫了一個 React Native 樣板