{"id":13455037,"url":"https://github.com/Bunlong/react-papaparse","last_synced_at":"2025-03-24T07:32:29.776Z","repository":{"id":38876659,"uuid":"240998172","full_name":"Bunlong/react-papaparse","owner":"Bunlong","description":"react-papaparse is the fastest in-browser CSV (or delimited text) parser for React. It is full of useful features such as CSVReader, CSVDownloader, readString, jsonToCSV, readRemoteFile, ... etc.","archived":false,"fork":false,"pushed_at":"2024-08-11T14:04:36.000Z","size":16523,"stargazers_count":370,"open_issues_count":54,"forks_count":61,"subscribers_count":3,"default_branch":"master","last_synced_at":"2024-10-29T15:23:38.867Z","etag":null,"topics":["browser-csv","csv","csv-parser","csv-reader","csv-to-json","csvreader","csvtojson","input","json-to-csv","jsontocsv","multithread","parsers","react","react-csv","react-csv-parser","react-csv-reader","react-papaparse","stream","thread","typescript"],"latest_commit_sha":null,"homepage":"https://react-papaparse.js.org","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Bunlong.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":"supports/create-next-app/.eslintrc.json","governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-02-17T01:46:49.000Z","updated_at":"2024-10-24T04:28:24.000Z","dependencies_parsed_at":"2024-01-13T17:33:47.650Z","dependency_job_id":"88555014-6a10-4431-8089-adf0e090f4a0","html_url":"https://github.com/Bunlong/react-papaparse","commit_stats":{"total_commits":513,"total_committers":17,"mean_commits":"30.176470588235293","dds":"0.033138401559454245","last_synced_commit":"02653ae0e1796ce2848394448fbc4e2710aa9b1f"},"previous_names":[],"tags_count":41,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Bunlong%2Freact-papaparse","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Bunlong%2Freact-papaparse/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Bunlong%2Freact-papaparse/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Bunlong%2Freact-papaparse/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Bunlong","download_url":"https://codeload.github.com/Bunlong/react-papaparse/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245227576,"owners_count":20580899,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["browser-csv","csv","csv-parser","csv-reader","csv-to-json","csvreader","csvtojson","input","json-to-csv","jsontocsv","multithread","parsers","react","react-csv","react-csv-parser","react-csv-reader","react-papaparse","stream","thread","typescript"],"created_at":"2024-07-31T08:01:00.539Z","updated_at":"2025-03-24T07:32:29.767Z","avatar_url":"https://github.com/Bunlong.png","language":"TypeScript","funding_links":[],"categories":["TypeScript"],"sub_categories":[],"readme":"# react-papaparse\n\nreact-papaparse is the fastest in-browser CSV (or delimited text) parser for React. It is full of useful features such as CSVReader, CSVDownloader, readString, jsonToCSV, readRemoteFile, ... etc.\n\n[![downloads](https://img.shields.io/npm/dm/react-papaparse.svg?label=monthly%20downloads)](https://www.npmjs.com/package/react-papaparse) [![downloads](https://img.shields.io/npm/dt/react-papaparse.svg?label=total%20downloads)](https://www.npmjs.com/package/react-papaparse)\n\n[![NPM](https://img.shields.io/npm/v/react-papaparse.svg)](https://www.npmjs.com/package/react-papaparse) ![npm bundle size](https://img.shields.io/bundlephobia/min/react-papaparse) [![Build Status](https://api.travis-ci.com/Bunlong/react-papaparse.svg?branch=master)](https://travis-ci.com/Bunlong/react-papaparse) [![JavaScript Style Guide](https://img.shields.io/badge/code_style-standard-brightgreen.svg)](https://standardjs.com)\n\n## 🎁 Features\n\n* Compatible with both JavaScript and TypeScript\n* Easy to use\n* Parse CSV files directly (local or over the network)\n* Fast mode (is really fast)\n* Stream large files (even via HTTP)\n* Reverse parsing (converts JSON to CSV)\n* Auto-detect delimiter\n* Worker threads to keep your web page reactive\n* Header row support\n* Pause, resume, abort\n* Can convert numbers and booleans to their types\n* One of the only parsers that correctly handles line-breaks and quotations\n\n## 🔧 Install\n\nreact-papaparse is available on npm. It can be installed with the following command:\n\n```\nnpm install react-papaparse --save\n```\n\nreact-papaparse is available on yarn as well. It can be installed with the following command:\n\n```\nyarn add react-papaparse --save\n```\n\n## 📖 Demo \u0026 Documentation\n\n* [Demo](https://react-papaparse.github.io/demo)\n\nTo learn how to use react-papaparse:\n\n* [Documentation](https://react-papaparse.github.io/docs)\n\n\u003c!-- FAQ:\n\n* [Sample of using CSVReader isSet](https://github.com/Bunlong/react-papaparse/wiki/Sample-of-using-CSVReader-isSet) --\u003e\n\n## 📚 Useful Features\n\n* [CSVReader](https://github.com/Bunlong/react-papaparse#-csvreader) – React component that handles csv files input and returns its content as array.\n* [CSVDownloader](https://github.com/Bunlong/react-papaparse#-csvdownloader) – React component that render the link/button which is clicked to download the data provided in CSV format.\n* [readString](https://github.com/Bunlong/react-papaparse#-readstring) – The function that read CSV comma separated string and returns its content as array.\n* [readRemoteFile](https://github.com/Bunlong/react-papaparse#-readremotefile) – The function that read remote CSV files and returns its content as array.\n* [jsonToCSV](https://github.com/Bunlong/react-papaparse#-jsontocsv) – The function that read an array of object (json) and returns its content as CSV comma separated string.\n\n## 💡 Usage\n\n### 🎀 CSVReader\n\n#### Basic Upload\n\n![basic-upload](https://react-papaparse.github.io/static/images/csvreader1.png)\n\n```javascript\nimport React, { CSSProperties } from 'react';\n\nimport { useCSVReader } from 'react-papaparse';\n\nconst styles = {\n  csvReader: {\n    display: 'flex',\n    flexDirection: 'row',\n    marginBottom: 10,\n  } as CSSProperties,\n  browseFile: {\n    width: '20%',\n  } as CSSProperties,\n  acceptedFile: {\n    border: '1px solid #ccc',\n    height: 45,\n    lineHeight: 2.5,\n    paddingLeft: 10,\n    width: '80%',\n  } as CSSProperties,\n  remove: {\n    borderRadius: 0,\n    padding: '0 20px',\n  } as CSSProperties,\n  progressBarBackgroundColor: {\n    backgroundColor: 'red',\n  } as CSSProperties,\n};\n\nexport default function CSVReader() {\n  const { CSVReader } = useCSVReader();\n\n  return (\n    \u003cCSVReader\n      onUploadAccepted={(results: any) =\u003e {\n        console.log('---------------------------');\n        console.log(results);\n        console.log('---------------------------');\n      }}\n    \u003e\n      {({\n        getRootProps,\n        acceptedFile,\n        ProgressBar,\n        getRemoveFileProps,\n      }: any) =\u003e (\n        \u003c\u003e\n          \u003cdiv style={styles.csvReader}\u003e\n            \u003cbutton type='button' {...getRootProps()} style={styles.browseFile}\u003e\n              Browse file\n            \u003c/button\u003e\n            \u003cdiv style={styles.acceptedFile}\u003e\n              {acceptedFile \u0026\u0026 acceptedFile.name}\n            \u003c/div\u003e\n            \u003cbutton {...getRemoveFileProps()} style={styles.remove}\u003e\n              Remove\n            \u003c/button\u003e\n          \u003c/div\u003e\n          \u003cProgressBar style={styles.progressBarBackgroundColor} /\u003e\n        \u003c/\u003e\n      )}\n    \u003c/CSVReader\u003e\n  );\n}\n```\n\n#### Click and Drag Upload\n\n![click-and-drag-upload](https://react-papaparse.github.io/static/images/csvreader2.png)\n\n```javascript\nimport React, { useState, CSSProperties } from 'react';\n\nimport {\n  useCSVReader,\n  lightenDarkenColor,\n  formatFileSize,\n} from 'react-papaparse';\n\nconst GREY = '#CCC';\nconst GREY_LIGHT = 'rgba(255, 255, 255, 0.4)';\nconst DEFAULT_REMOVE_HOVER_COLOR = '#A01919';\nconst REMOVE_HOVER_COLOR_LIGHT = lightenDarkenColor(\n  DEFAULT_REMOVE_HOVER_COLOR,\n  40\n);\nconst GREY_DIM = '#686868';\n\nconst styles = {\n  zone: {\n    alignItems: 'center',\n    border: `2px dashed ${GREY}`,\n    borderRadius: 20,\n    display: 'flex',\n    flexDirection: 'column',\n    height: '100%',\n    justifyContent: 'center',\n    padding: 20,\n  } as CSSProperties,\n  file: {\n    background: 'linear-gradient(to bottom, #EEE, #DDD)',\n    borderRadius: 20,\n    display: 'flex',\n    height: 120,\n    width: 120,\n    position: 'relative',\n    zIndex: 10,\n    flexDirection: 'column',\n    justifyContent: 'center',\n  } as CSSProperties,\n  info: {\n    alignItems: 'center',\n    display: 'flex',\n    flexDirection: 'column',\n    paddingLeft: 10,\n    paddingRight: 10,\n  } as CSSProperties,\n  size: {\n    backgroundColor: GREY_LIGHT,\n    borderRadius: 3,\n    marginBottom: '0.5em',\n    justifyContent: 'center',\n    display: 'flex',\n  } as CSSProperties,\n  name: {\n    backgroundColor: GREY_LIGHT,\n    borderRadius: 3,\n    fontSize: 12,\n    marginBottom: '0.5em',\n  } as CSSProperties,\n  progressBar: {\n    bottom: 14,\n    position: 'absolute',\n    width: '100%',\n    paddingLeft: 10,\n    paddingRight: 10,\n  } as CSSProperties,\n  zoneHover: {\n    borderColor: GREY_DIM,\n  } as CSSProperties,\n  default: {\n    borderColor: GREY,\n  } as CSSProperties,\n  remove: {\n    height: 23,\n    position: 'absolute',\n    right: 6,\n    top: 6,\n    width: 23,\n  } as CSSProperties,\n};\n\nexport default function CSVReader() {\n  const { CSVReader } = useCSVReader();\n  const [zoneHover, setZoneHover] = useState(false);\n  const [removeHoverColor, setRemoveHoverColor] = useState(\n    DEFAULT_REMOVE_HOVER_COLOR\n  );\n\n  return (\n    \u003cCSVReader\n      onUploadAccepted={(results: any) =\u003e {\n        console.log('---------------------------');\n        console.log(results);\n        console.log('---------------------------');\n        setZoneHover(false);\n      }}\n      onDragOver={(event: DragEvent) =\u003e {\n        event.preventDefault();\n        setZoneHover(true);\n      }}\n      onDragLeave={(event: DragEvent) =\u003e {\n        event.preventDefault();\n        setZoneHover(false);\n      }}\n    \u003e\n      {({\n        getRootProps,\n        acceptedFile,\n        ProgressBar,\n        getRemoveFileProps,\n        Remove,\n      }: any) =\u003e (\n        \u003c\u003e\n          \u003cdiv\n            {...getRootProps()}\n            style={Object.assign(\n              {},\n              styles.zone,\n              zoneHover \u0026\u0026 styles.zoneHover\n            )}\n          \u003e\n            {acceptedFile ? (\n              \u003c\u003e\n                \u003cdiv style={styles.file}\u003e\n                  \u003cdiv style={styles.info}\u003e\n                    \u003cspan style={styles.size}\u003e\n                      {formatFileSize(acceptedFile.size)}\n                    \u003c/span\u003e\n                    \u003cspan style={styles.name}\u003e{acceptedFile.name}\u003c/span\u003e\n                  \u003c/div\u003e\n                  \u003cdiv style={styles.progressBar}\u003e\n                    \u003cProgressBar /\u003e\n                  \u003c/div\u003e\n                  \u003cdiv\n                    {...getRemoveFileProps()}\n                    style={styles.remove}\n                    onMouseOver={(event: Event) =\u003e {\n                      event.preventDefault();\n                      setRemoveHoverColor(REMOVE_HOVER_COLOR_LIGHT);\n                    }}\n                    onMouseOut={(event: Event) =\u003e {\n                      event.preventDefault();\n                      setRemoveHoverColor(DEFAULT_REMOVE_HOVER_COLOR);\n                    }}\n                  \u003e\n                    \u003cRemove color={removeHoverColor} /\u003e\n                  \u003c/div\u003e\n                \u003c/div\u003e\n              \u003c/\u003e\n            ) : (\n              'Drop CSV file here or click to upload'\n            )}\n          \u003c/div\u003e\n        \u003c/\u003e\n      )}\n    \u003c/CSVReader\u003e\n  );\n}\n```\n\n#### Drag ( No Click ) Upload\n\n![drag-no-click-upload](https://react-papaparse.github.io/static/images/csvreader3.png)\n\n```javascript\nimport React, { useState, CSSProperties } from 'react';\n\nimport {\n  useCSVReader,\n  lightenDarkenColor,\n  formatFileSize,\n} from 'react-papaparse';\n\nconst GREY = '#CCC';\nconst GREY_LIGHT = 'rgba(255, 255, 255, 0.4)';\nconst DEFAULT_REMOVE_HOVER_COLOR = '#A01919';\nconst REMOVE_HOVER_COLOR_LIGHT = lightenDarkenColor(\n  DEFAULT_REMOVE_HOVER_COLOR,\n  40\n);\nconst GREY_DIM = '#686868';\n\nconst styles = {\n  zone: {\n    alignItems: 'center',\n    border: `2px dashed ${GREY}`,\n    borderRadius: 20,\n    display: 'flex',\n    flexDirection: 'column',\n    height: '100%',\n    justifyContent: 'center',\n    padding: 20,\n  } as CSSProperties,\n  file: {\n    background: 'linear-gradient(to bottom, #EEE, #DDD)',\n    borderRadius: 20,\n    display: 'flex',\n    height: 120,\n    width: 120,\n    position: 'relative',\n    zIndex: 10,\n    flexDirection: 'column',\n    justifyContent: 'center',\n  } as CSSProperties,\n  info: {\n    alignItems: 'center',\n    display: 'flex',\n    flexDirection: 'column',\n    paddingLeft: 10,\n    paddingRight: 10,\n  } as CSSProperties,\n  size: {\n    backgroundColor: GREY_LIGHT,\n    borderRadius: 3,\n    marginBottom: '0.5em',\n    justifyContent: 'center',\n    display: 'flex',\n  } as CSSProperties,\n  name: {\n    backgroundColor: GREY_LIGHT,\n    borderRadius: 3,\n    fontSize: 12,\n    marginBottom: '0.5em',\n  } as CSSProperties,\n  progressBar: {\n    bottom: 14,\n    position: 'absolute',\n    width: '100%',\n    paddingLeft: 10,\n    paddingRight: 10,\n  } as CSSProperties,\n  zoneHover: {\n    borderColor: GREY_DIM,\n  } as CSSProperties,\n  default: {\n    borderColor: GREY,\n  } as CSSProperties,\n  remove: {\n    height: 23,\n    position: 'absolute',\n    right: 6,\n    top: 6,\n    width: 23,\n  } as CSSProperties,\n};\n\nexport default function CSVReader() {\n  const { CSVReader } = useCSVReader();\n  const [zoneHover, setZoneHover] = useState(false);\n  const [removeHoverColor, setRemoveHoverColor] = useState(\n    DEFAULT_REMOVE_HOVER_COLOR\n  );\n\n  return (\n    \u003cCSVReader\n      onUploadAccepted={(results: any) =\u003e {\n        console.log('---------------------------');\n        console.log(results);\n        console.log('---------------------------');\n        setZoneHover(false);\n      }}\n      onDragOver={(event: DragEvent) =\u003e {\n        event.preventDefault();\n        setZoneHover(true);\n      }}\n      onDragLeave={(event: DragEvent) =\u003e {\n        event.preventDefault();\n        setZoneHover(false);\n      }}\n      noClick\n    \u003e\n      {({\n        getRootProps,\n        acceptedFile,\n        ProgressBar,\n        getRemoveFileProps,\n        Remove,\n      }: any) =\u003e (\n        \u003c\u003e\n          \u003cdiv\n            {...getRootProps()}\n            style={Object.assign(\n              {},\n              styles.zone,\n              zoneHover \u0026\u0026 styles.zoneHover\n            )}\n          \u003e\n            {acceptedFile ? (\n              \u003c\u003e\n                \u003cdiv style={styles.file}\u003e\n                  \u003cdiv style={styles.info}\u003e\n                    \u003cspan style={styles.size}\u003e\n                      {formatFileSize(acceptedFile.size)}\n                    \u003c/span\u003e\n                    \u003cspan style={styles.name}\u003e{acceptedFile.name}\u003c/span\u003e\n                  \u003c/div\u003e\n                  \u003cdiv style={styles.progressBar}\u003e\n                    \u003cProgressBar /\u003e\n                  \u003c/div\u003e\n                  \u003cdiv\n                    {...getRemoveFileProps()}\n                    style={styles.remove}\n                    onMouseOver={(event: Event) =\u003e {\n                      event.preventDefault();\n                      setRemoveHoverColor(REMOVE_HOVER_COLOR_LIGHT);\n                    }}\n                    onMouseOut={(event: Event) =\u003e {\n                      event.preventDefault();\n                      setRemoveHoverColor(DEFAULT_REMOVE_HOVER_COLOR);\n                    }}\n                  \u003e\n                    \u003cRemove color={removeHoverColor} /\u003e\n                  \u003c/div\u003e\n                \u003c/div\u003e\n              \u003c/\u003e\n            ) : (\n              'Drop CSV file here to upload'\n            )}\n          \u003c/div\u003e\n        \u003c/\u003e\n      )}\n    \u003c/CSVReader\u003e\n  );\n}\n```\n\n#### Click ( No Drag ) Upload\n\n![click-no-drag-upload](https://react-papaparse.github.io/static/images/csvreader4.png)\n\n```javascript\nimport React, { useState, CSSProperties } from 'react';\n\nimport {\n  useCSVReader,\n  lightenDarkenColor,\n  formatFileSize,\n} from 'react-papaparse';\n\nconst GREY = '#CCC';\nconst GREY_LIGHT = 'rgba(255, 255, 255, 0.4)';\nconst DEFAULT_REMOVE_HOVER_COLOR = '#A01919';\nconst REMOVE_HOVER_COLOR_LIGHT = lightenDarkenColor(\n  DEFAULT_REMOVE_HOVER_COLOR,\n  40\n);\nconst GREY_DIM = '#686868';\n\nconst styles = {\n  zone: {\n    alignItems: 'center',\n    border: `2px dashed ${GREY}`,\n    borderRadius: 20,\n    display: 'flex',\n    flexDirection: 'column',\n    height: '100%',\n    justifyContent: 'center',\n    padding: 20,\n  } as CSSProperties,\n  file: {\n    background: 'linear-gradient(to bottom, #EEE, #DDD)',\n    borderRadius: 20,\n    display: 'flex',\n    height: 120,\n    width: 120,\n    position: 'relative',\n    zIndex: 10,\n    flexDirection: 'column',\n    justifyContent: 'center',\n  } as CSSProperties,\n  info: {\n    alignItems: 'center',\n    display: 'flex',\n    flexDirection: 'column',\n    paddingLeft: 10,\n    paddingRight: 10,\n  } as CSSProperties,\n  size: {\n    backgroundColor: GREY_LIGHT,\n    borderRadius: 3,\n    marginBottom: '0.5em',\n    justifyContent: 'center',\n    display: 'flex',\n  } as CSSProperties,\n  name: {\n    backgroundColor: GREY_LIGHT,\n    borderRadius: 3,\n    fontSize: 12,\n    marginBottom: '0.5em',\n  } as CSSProperties,\n  progressBar: {\n    bottom: 14,\n    position: 'absolute',\n    width: '100%',\n    paddingLeft: 10,\n    paddingRight: 10,\n  } as CSSProperties,\n  zoneHover: {\n    borderColor: GREY_DIM,\n  } as CSSProperties,\n  default: {\n    borderColor: GREY,\n  } as CSSProperties,\n  remove: {\n    height: 23,\n    position: 'absolute',\n    right: 6,\n    top: 6,\n    width: 23,\n  } as CSSProperties,\n};\n\nexport default function CSVReader() {\n  const { CSVReader } = useCSVReader();\n  const [zoneHover, setZoneHover] = useState(false);\n  const [removeHoverColor, setRemoveHoverColor] = useState(\n    DEFAULT_REMOVE_HOVER_COLOR\n  );\n\n  return (\n    \u003cCSVReader\n      onUploadAccepted={(results: any) =\u003e {\n        console.log('---------------------------');\n        console.log(results);\n        console.log('---------------------------');\n        setZoneHover(false);\n      }}\n      onDragOver={(event: DragEvent) =\u003e {\n        event.preventDefault();\n        setZoneHover(true);\n      }}\n      onDragLeave={(event: DragEvent) =\u003e {\n        event.preventDefault();\n        setZoneHover(false);\n      }}\n      noDrag\n    \u003e\n      {({\n        getRootProps,\n        acceptedFile,\n        ProgressBar,\n        getRemoveFileProps,\n        Remove,\n      }: any) =\u003e (\n        \u003c\u003e\n          \u003cdiv\n            {...getRootProps()}\n            style={Object.assign(\n              {},\n              styles.zone,\n              zoneHover \u0026\u0026 styles.zoneHover\n            )}\n          \u003e\n            {acceptedFile ? (\n              \u003c\u003e\n                \u003cdiv style={styles.file}\u003e\n                  \u003cdiv style={styles.info}\u003e\n                    \u003cspan style={styles.size}\u003e\n                      {formatFileSize(acceptedFile.size)}\n                    \u003c/span\u003e\n                    \u003cspan style={styles.name}\u003e{acceptedFile.name}\u003c/span\u003e\n                  \u003c/div\u003e\n                  \u003cdiv style={styles.progressBar}\u003e\n                    \u003cProgressBar /\u003e\n                  \u003c/div\u003e\n                  \u003cdiv\n                    {...getRemoveFileProps()}\n                    style={styles.remove}\n                    onMouseOver={(event: Event) =\u003e {\n                      event.preventDefault();\n                      setRemoveHoverColor(REMOVE_HOVER_COLOR_LIGHT);\n                    }}\n                    onMouseOut={(event: Event) =\u003e {\n                      event.preventDefault();\n                      setRemoveHoverColor(DEFAULT_REMOVE_HOVER_COLOR);\n                    }}\n                  \u003e\n                    \u003cRemove color={removeHoverColor} /\u003e\n                  \u003c/div\u003e\n                \u003c/div\u003e\n              \u003c/\u003e\n            ) : (\n              'Click to upload'\n            )}\n          \u003c/div\u003e\n        \u003c/\u003e\n      )}\n    \u003c/CSVReader\u003e\n  );\n}\n```\n\n### 🎀 CSVDownloader\n\nJust pass in the js object with an optional [configuration](https://react-papaparse.js.org/docs#config) ( setting delimiter / separator ).\n\n**Note:** If you want to open your CSV files in Excel, you might want to set `bom={true}` or `bom`, default is `false`. This option adds the so called BOM byte `'\\ufeff'` to the beginning of your CSV files and tells Excel that the encoding is UTF8.\n\n#### Button\n\n```javascript\nimport React from 'react';\n\nimport { useCSVDownloader } from 'react-papaparse';\n\nexport default function CSVDownloader() {\n  const { CSVDownloader, Type } = useCSVDownloader();\n\n  return (\n    \u003cCSVDownloader\n      type={Type.Button}\n      filename={'filename'}\n      bom={true}\n      config={{\n        delimiter: ';',\n      }}\n      data={[\n        {\n          'Column 1': '1-1',\n          'Column 2': '1-2',\n          'Column 3': '1-3',\n          'Column 4': '1-4',\n        },\n        {\n          'Column 1': '2-1',\n          'Column 2': '2-2',\n          'Column 3': '2-3',\n          'Column 4': '2-4',\n        },\n        {\n          'Column 1': '3-1',\n          'Column 2': '3-2',\n          'Column 3': '3-3',\n          'Column 4': '3-4',\n        },\n        {\n          'Column 1': 4,\n          'Column 2': 5,\n          'Column 3': 6,\n          'Column 4': 7,\n        },\n      ]}\n    \u003e\n      Download\n    \u003c/CSVDownloader\u003e\n  );\n}\n```\n\n#### Link\n\n```javascript\nimport React from 'react';\n\nimport { useCSVDownloader } from 'react-papaparse';\n\nexport default function CSVDownloader() {\n  const { CSVDownloader, Type } = useCSVDownloader();\n\n  return (\n    \u003cCSVDownloader\n      type={Type.Link}\n      filename={'filename'}\n      bom={true}\n      data={`Column 1,Column 2,Column 3,Column 4\n1-1,1-2,1-3,1-4\n#2-1,मुकेश,ខ្ញុំ,2-4\n3-1,3-2,អ្នក,3-4\n4,5,6,7`}\n    \u003e\n      Download\n    \u003c/CSVDownloader\u003e\n  );\n}\n```\n\n#### Data as a Function/Callback\n\n`data={}` can be a synchronous or asynchronous function that returns a data object.\n\n```javascript\nimport React from 'react';\n\nimport { useCSVDownloader } from 'react-papaparse';\n\nexport default function CSVDownloader() {\n  const { CSVDownloader } = useCSVDownloader();\n\n  return (\n    \u003cCSVDownloader\n      filename={'filename'}\n      data={() =\u003e {\n        return [\n          {\n            \"Column 1\": \"1-1\",\n            \"Column 2\": \"1-2\",\n            \"Column 3\": \"1-3\",\n            \"Column 4\": \"1-4\",\n          }\n        ]}\n      }\n    \u003e\n      Download\n    \u003c/CSVDownloader\u003e\n  );\n}\n```\n\n### 🎀 readString\n\n```javascript\nimport React from 'react';\n\nimport { usePapaParse } from 'react-papaparse';\n\nexport default function ReadString() {\n  const { readString } = usePapaParse();\n\n  const handleReadString = () =\u003e {\n    const csvString = `Column 1,Column 2,Column 3,Column 4\n1-1,1-2,1-3,1-4\n2-1,2-2,2-3,2-4\n3-1,3-2,3-3,3-4\n4,5,6,7`;\n\n    readString(csvString, {\n      worker: true,\n      complete: (results) =\u003e {\n        console.log('---------------------------');\n        console.log(results);\n        console.log('---------------------------');\n      },\n    });\n  };\n\n  return \u003cbutton onClick={() =\u003e handleReadString()}\u003ereadString\u003c/button\u003e;\n}\n```\n\n### 🎀 readRemoteFile\n\n```javascript\nimport React from 'react';\n\nimport { usePapaParse } from 'react-papaparse';\n\nexport default function ReadRemoteFile() {\n  const { readRemoteFile } = usePapaParse();\n\n  const handleReadRemoteFile = () =\u003e {\n    readRemoteFile(url, {\n      complete: (results) =\u003e {\n        console.log('---------------------------');\n        console.log('Results:', results);\n        console.log('---------------------------');\n      },\n    });\n  };\n\n  return \u003cbutton onClick={() =\u003e handleReadRemoteFile()}\u003ereadRemoteFile\u003c/button\u003e;\n}\n```\n\n### 🎀 jsonToCSV\n\n```javascript\nimport React from 'react';\n\nimport { usePapaParse } from 'react-papaparse';\n\nexport default function JsonToCSV() {\n  const { jsonToCSV } = usePapaParse();\n\n  const handleJsonToCSV = () =\u003e {\n    const jsonData = [\n      {\n          \"Column 1\": \"1-1\",\n          \"Column 2\": \"1-2\",\n          \"Column 3\": \"1-3\",\n          \"Column 4\": \"1-4\"\n      },\n      {\n          \"Column 1\": \"2-1\",\n          \"Column 2\": \"2-2\",\n          \"Column 3\": \"2-3\",\n          \"Column 4\": \"2-4\"\n      },\n      {\n          \"Column 1\": \"3-1\",\n          \"Column 2\": \"3-2\",\n          \"Column 3\": \"3-3\",\n          \"Column 4\": \"3-4\"\n      },\n      {\n          \"Column 1\": 4,\n          \"Column 2\": 5,\n          \"Column 3\": 6,\n          \"Column 4\": 7\n      }\n    ];\n    const results = jsonToCSV(jsonData);\n    console.log('---------------------------');\n    console.log('Results:', results);\n    console.log('---------------------------');\n  };\n\n  return \u003cbutton onClick={() =\u003e handleJsonToCSV()}\u003ejsonToCSV\u003c/button\u003e;\n}\n```\n\n#### Header Row Support\n\nIf you tell react-papaparse there is a header row, each row will be organized by field name instead of index.\n\n```javascript\nimport { usePapaParse } from 'react-papaparse';\n\nconst { readString } = usePapaParse();\n\nreadString(csvString, {\n  header: true,\n  worker: true,\n  complete: (results) =\u003e {\n    console.log('---------------------------');\n    console.log(results);\n    console.log('---------------------------');\n  },\n});\n```\n\n#### Stream\n\nThat's what streaming is for. Specify a step callback to receive the results row-by-row. This way, you won't load the whole file into memory and crash the browser.\n\n```javascript\nimport { usePapaParse } from 'react-papaparse';\n\nconst { readRemoteFile } = usePapaParse();\n\nreadRemoteFile(url, {\n  step: (row) =\u003e {\n    console.log('Row:', row.data);\n  },\n  complete: () =\u003e {\n    console.log('All done!');\n  }\n});\n```\n\n## 📜 Changelog\n\nLatest version 4.4.0 (2023-10-14):\n\n  * Handle parsing utf-8 bom encoded files\n  * Rename duplicate headers\n  * Improve iso-date regex\n\nVersion 4.3.0 (2023-10-10):\n\n  * Enable async callback function for CSVDownloader\n\nVersion 4.2.2 (2023-10-09):\n\n  * Fix type\n\nVersion 4.2.0 (2023-10-07):\n\n  * Upgrade dependencies\n\nVersion 4.1.0 (2022-08-07):\n\n  * Import readString, readRemoteFile and jsonToCSV as pure function\n\nVersion 4.0.4 (2022-08-06):\n\n  * Add optional required prop for input file\n\nVersion 4.0.2 (2022-01-26):\n\n  * Fix onUploadAccepted signature when a preview is set\n\nVersion 4.0.1 (2022-01-21):\n\n  * Fix config props does not work in CSVReader\n\nVersion 4.0.0 (2022-01-18):\n\n  * Improve code performance\n  * Rewrite any existing based components to hooks\n\nDetails changes for each release are documented in the [CHANGELOG.md](https://github.com/Bunlong/react-papaparse/blob/master/CHANGELOG.md).\n\n## 🛣️ Roadmap\n\n### 🆕 v4.4.x\n\n  * CSVReader multiple files drag and drop\n\n## ❗ Issues\n\nIf you think any of the `react-papaparse` can be improved, please do open a PR with any updates and submit any issues. Also, I will continue to improve this, so you might want to watch/star this repository to revisit.\n\n## 💪 Contribution\n\nWe'd love to have your helping hand on contributions to `react-papaparse` by forking and sending a pull request!\n\nYour contributions are heartily ♡ welcome, recognized and appreciated. (✿◠‿◠)\n\nHow to contribute:\n\n- Open pull request with improvements\n- Discuss ideas in issues\n- Spread the word\n- Reach out with any feedback\n\n## 🏆 Contributors\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003ca href=\"https://github.com/Bunlong\"\u003e\n        \u003cimg src=\"https://avatars0.githubusercontent.com/u/1308397?s=400\u0026u=945dc6b97571e2b98b659d34b1c81ae2514046bf\u0026v=4\" width=\"100\" alt=\"Bunlong\" /\u003e\n        \u003cbr /\u003e\n        \u003csub\u003e\n          \u003cb\u003eBunlong\u003c/b\u003e\n        \u003c/sub\u003e\n      \u003c/a\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003ca href=\"https://github.com/timtutt\"\u003e\n        \u003cimg src=\"https://avatars0.githubusercontent.com/u/1517492?s=400\u0026u=5aa483a9df5cdeb0824dd9db92348dbda483df22\u0026v=4\" width=\"100\" alt=\"Tim Tutt\" /\u003e\n        \u003cbr /\u003e\n        \u003csub\u003e\n          \u003cb\u003eTim Tutt\u003c/b\u003e\n        \u003c/sub\u003e\n      \u003c/a\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003ca href=\"https://github.com/pkuppens\"\u003e\n        \u003cimg src=\"https://avatars2.githubusercontent.com/u/8671392?s=460\u0026u=fe33bd06c7fd8bb7637a7dbe9681932b065f29f6\u0026v=4\" width=\"100\" alt=\"Pieter Kuppens\" /\u003e\n        \u003cbr /\u003e\n        \u003csub\u003e\n          \u003cb\u003ePieter Kuppens\u003c/b\u003e\n        \u003c/sub\u003e\n      \u003c/a\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003ca href=\"https://github.com/bugzpodder\"\u003e\n        \u003cimg src=\"https://avatars1.githubusercontent.com/u/14841421?s=460\u0026u=9e9735544217bc05e7ac7f94c398d98924089fb1\u0026v=4\" width=\"100\" alt=\"Jack Zhao\" /\u003e\n        \u003cbr /\u003e\n        \u003csub\u003e\n          \u003cb\u003eJack Zhao\u003c/b\u003e\n        \u003c/sub\u003e\n      \u003c/a\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003ca href=\"https://github.com/pabloameni\"\u003e\n        \u003cimg src=\"https://avatars3.githubusercontent.com/u/52842336?s=460\u0026v=4\" width=\"100\" alt=\"Pablo Menichini\" /\u003e\n        \u003cbr /\u003e\n        \u003csub\u003e\n          \u003cb\u003ePablo Menichini\u003c/b\u003e\n        \u003c/sub\u003e\n      \u003c/a\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003ca href=\"https://github.com/mysticaltech\"\u003e\n        \u003cimg src=\"https://avatars0.githubusercontent.com/u/518555?s=400\u0026u=0537eaf44c5fe646aa0831d88d726c10ccdc317f\u0026v=4\" width=\"100\" alt=\"Mystical Tech\" /\u003e\n        \u003cbr /\u003e\n        \u003csub\u003e\n          \u003cb\u003eMystical Tech\u003c/b\u003e\n        \u003c/sub\u003e\n      \u003c/a\u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003ca href=\"https://github.com/takebo\"\u003e\n        \u003cimg src=\"https://avatars1.githubusercontent.com/u/5289210?s=400\u0026u=0d0abca823b6e45d07eb521bcdfad5287b9cfb3e\u0026v=4\" width=\"100\" alt=\"Bruno\" /\u003e\n        \u003cbr /\u003e\n        \u003csub\u003e\n          \u003cb\u003eBruno\u003c/b\u003e\n        \u003c/sub\u003e\n      \u003c/a\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003ca href=\"https://github.com/samuelhulla\"\u003e\n        \u003cimg src=\"https://avatars0.githubusercontent.com/u/17268815?s=400\u0026u=dbfc4d951f2df4a202ec037794b6e3dfa1bac88e\u0026v=4\" width=\"100\" alt=\"Samuel Hulla\" /\u003e\n        \u003cbr /\u003e\n        \u003csub\u003e\n          \u003cb\u003eSamuel Hulla\u003c/b\u003e\n        \u003c/sub\u003e\n      \u003c/a\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003ca href=\"https://github.com/glinkot\"\u003e\n        \u003cimg src=\"https://avatars0.githubusercontent.com/u/13640691?s=400\u0026v=4\" width=\"100\" alt=\"glinkot\" /\u003e\n        \u003cbr /\u003e\n        \u003csub\u003e\n          \u003cb\u003eglinkot\u003c/b\u003e\n        \u003c/sub\u003e\n      \u003c/a\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003ca href=\"https://github.com/pleavitt\"\u003e\n        \u003cimg src=\"https://avatars2.githubusercontent.com/u/33077532?s=400\u0026u=ecfdf7ac6e89d66329fb409b7b0c5c3c2e7494ca\u0026v=4\" width=\"100\" alt=\"Paul Leavitt\" /\u003e\n        \u003cbr /\u003e\n        \u003csub\u003e\n          \u003cb\u003ePaul Leavitt\u003c/b\u003e\n        \u003c/sub\u003e\n      \u003c/a\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003ca href=\"https://github.com/gtupak\"\u003e\n        \u003cimg src=\"https://avatars2.githubusercontent.com/u/5834876?s=400\u0026u=8c38f633c231b53f58d8f4d091994cf9ec98f594\u0026v=4\" width=\"100\" alt=\"Gabriel\" /\u003e\n        \u003cbr /\u003e\n        \u003csub\u003e\n          \u003cb\u003eGabriel\u003c/b\u003e\n        \u003c/sub\u003e\n      \u003c/a\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003ca href=\"https://github.com/sakkie6yster\"\u003e\n        \u003cimg src=\"https://avatars0.githubusercontent.com/u/20445565?s=400\u0026u=9db346c3217e36514bda7af2cd66a08146608757\u0026v=4\" width=\"100\" alt=\"Izaak\" /\u003e\n        \u003cbr /\u003e\n        \u003csub\u003e\n          \u003cb\u003eIzaak\u003c/b\u003e\n        \u003c/sub\u003e\n      \u003c/a\u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003ca href=\"https://github.com/Olovorr\"\u003e\n        \u003cimg src=\"https://avatars0.githubusercontent.com/u/15366622?s=400\u0026u=deb7491f406673d6dffbf7f2d16554b5155c08ab\u0026v=4\" width=\"100\" alt=\"Oliver\" /\u003e\n        \u003cbr /\u003e\n        \u003csub\u003e\n          \u003cb\u003eOliver\u003c/b\u003e\n        \u003c/sub\u003e\n      \u003c/a\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003ca href=\"https://github.com/OleSkaar\"\u003e\n        \u003cimg src=\"https://avatars0.githubusercontent.com/u/5891010?s=400\u0026u=bf64ec4f21d9ec2373829e053886b6dd09ed63dc\u0026v=4\" width=\"100\" alt=\"Ole Skaar\" /\u003e\n        \u003cbr /\u003e\n        \u003csub\u003e\n          \u003cb\u003eOle Skaar\u003c/b\u003e\n        \u003c/sub\u003e\n      \u003c/a\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003ca href=\"https://github.com/des09\"\u003e\n        \u003cimg src=\"https://avatars3.githubusercontent.com/u/3218179?s=400\u0026v=4\" width=\"100\" alt=\"Des\" /\u003e\n        \u003cbr /\u003e\n        \u003csub\u003e\n          \u003cb\u003eDes\u003c/b\u003e\n        \u003c/sub\u003e\n      \u003c/a\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003ca href=\"https://github.com/karland\"\u003e\n        \u003cimg src=\"https://avatars1.githubusercontent.com/u/4803370?s=400\u0026u=506eec3afe53f1d938a2402d25bc172424b875c4\u0026v=4\" width=\"100\" alt=\"Karl\" /\u003e\n        \u003cbr /\u003e\n        \u003csub\u003e\n          \u003cb\u003eKarl\u003c/b\u003e\n        \u003c/sub\u003e\n      \u003c/a\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003ca href=\"https://github.com/MaxAst\"\u003e\n        \u003cimg src=\"https://avatars2.githubusercontent.com/u/13224092?s=400\u0026u=c4a728e34f4ce465df4ad0989676acef7eb3faff\u0026v=4\" width=\"100\" alt=\"Max\" /\u003e\n        \u003cbr /\u003e\n        \u003csub\u003e\n          \u003cb\u003eMax\u003c/b\u003e\n        \u003c/sub\u003e\n      \u003c/a\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003ca href=\"https://github.com/kapekost\"\u003e\n        \u003cimg src=\"https://avatars1.githubusercontent.com/u/5909422?s=400\u0026u=da9aa28b557b80144cc46241dd56220dcc41cff3\u0026v=4\" width=\"100\" alt=\"Kostas\" /\u003e\n        \u003cbr /\u003e\n        \u003csub\u003e\n          \u003cb\u003eKostas\u003c/b\u003e\n        \u003c/sub\u003e\n      \u003c/a\u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003ca href=\"https://github.com/Dalitzky\"\u003e\n        \u003cimg src=\"https://avatars0.githubusercontent.com/u/12782201?s=400\u0026v=4\" width=\"100\" alt=\"Dalitzky\" /\u003e\n        \u003cbr /\u003e\n        \u003csub\u003e\n          \u003cb\u003eDalitzky\u003c/b\u003e\n        \u003c/sub\u003e\n      \u003c/a\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003ca href=\"https://github.com/jqrtr\"\u003e\n        \u003cimg src=\"https://avatars.githubusercontent.com/u/54841915?s=400\u0026v=4\" width=\"100\" alt=\"John Quinlivan\" /\u003e\n        \u003cbr /\u003e\n        \u003csub\u003e\n          \u003cb\u003eJohn Quinlivan\u003c/b\u003e\n        \u003c/sub\u003e\n      \u003c/a\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003ca href=\"https://github.com/G-Rath\"\u003e\n        \u003cimg src=\"https://avatars.githubusercontent.com/u/3151613?v=4\" width=\"100\" alt=\"Gareth Jones\" /\u003e\n        \u003cbr /\u003e\n        \u003csub\u003e\n          \u003cb\u003eGareth Jones\u003c/b\u003e\n        \u003c/sub\u003e\n      \u003c/a\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003ca href=\"https://github.com/exaucae\"\u003e\n        \u003cimg src=\"https://avatars.githubusercontent.com/u/64139733?v=4\" width=\"100\" alt=\"Chrys Exaucet\" /\u003e\n        \u003cbr /\u003e\n        \u003csub\u003e\n          \u003cb\u003eChrys Exaucet\u003c/b\u003e\n        \u003c/sub\u003e\n      \u003c/a\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003ca href=\"https://github.com/stefee\"\u003e\n        \u003cimg src=\"https://avatars.githubusercontent.com/u/18026180?v=4\" width=\"100\" alt=\"Stefee\" /\u003e\n        \u003cbr /\u003e\n        \u003csub\u003e\n          \u003cb\u003eStefee\u003c/b\u003e\n        \u003c/sub\u003e\n      \u003c/a\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003ca href=\"https://github.com/BirdTho\"\u003e\n        \u003cimg src=\"https://avatars.githubusercontent.com/u/10731513?v=4\" width=\"100\" alt=\"Christopher Thomas\" /\u003e\n        \u003cbr /\u003e\n        \u003csub\u003e\n          \u003cb\u003eChristopher Thomas\u003c/b\u003e\n        \u003c/sub\u003e\n      \u003c/a\u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003ca href=\"https://github.com/Graveheart\"\u003e\n        \u003cimg src=\"https://avatars.githubusercontent.com/u/6318562?v=4\" width=\"100\" alt=\"Venelin Banov\" /\u003e\n        \u003cbr /\u003e\n        \u003csub\u003e\n          \u003cb\u003eVenelin Banov\u003c/b\u003e\n        \u003c/sub\u003e\n      \u003c/a\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003ca href=\"https://github.com/joey-b\"\u003e\n        \u003cimg src=\"https://avatars.githubusercontent.com/u/3277786?v=4\" width=\"100\" alt=\"Joey Baker\" /\u003e\n        \u003cbr /\u003e\n        \u003csub\u003e\n          \u003cb\u003eJoey Baker\u003c/b\u003e\n        \u003c/sub\u003e\n      \u003c/a\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003ca href=\"https://github.com/MichielDeMey\"\u003e\n        \u003cimg src=\"https://avatars.githubusercontent.com/u/793406?v=4\" width=\"100\" alt=\"Michiel De Mey\" /\u003e\n        \u003cbr /\u003e\n        \u003csub\u003e\n          \u003cb\u003eMichiel De Mey\u003c/b\u003e\n        \u003c/sub\u003e\n      \u003c/a\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003ca href=\"https://github.com/hussamkhatib\"\u003e\n        \u003cimg src=\"https://avatars.githubusercontent.com/u/52914487?v=4\" width=\"100\" alt=\"Mohammed Hussam\" /\u003e\n        \u003cbr /\u003e\n        \u003csub\u003e\n          \u003cb\u003eMohammed Hussam\u003c/b\u003e\n        \u003c/sub\u003e\n      \u003c/a\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003ca href=\"https://github.com/s5s5\"\u003e\n        \u003cimg src=\"https://avatars.githubusercontent.com/u/473706?v=4\" width=\"100\" alt=\"Xiaochao Liu\" /\u003e\n        \u003cbr /\u003e\n        \u003csub\u003e\n          \u003cb\u003eXiaochao Liu\u003c/b\u003e\n        \u003c/sub\u003e\n      \u003c/a\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\n      \u003ca href=\"https://github.com/s5s5\"\u003e\n        \u003cimg src=\"https://avatars.githubusercontent.com/u/6137499?v=4\" width=\"100\" alt=\"Jake Haitsma\" /\u003e\n        \u003cbr /\u003e\n        \u003csub\u003e\n          \u003cb\u003eJake Haitsma\u003c/b\u003e\n        \u003c/sub\u003e\n      \u003c/a\u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n## 👨‍👩‍👦 Advertisement\n\nYou maybe interested.\n\n* [React Patterns](https://github.com/reactpatterns/reactpatterns) – React patterns \u0026 techniques to use in development for React Developer.\n* [Next Share](https://github.com/Bunlong/next-share) – Social media share buttons for your next React apps.\n* [Next QRCode](https://github.com/bunlong/next-qrcode) – React hooks for generating QR code for your next React apps.\n* [Next Time Ago](https://github.com/Bunlong/next-time-ago) – A lightweight tiny time-ago component for your next React apps.\n\n## ⚖️ License\n\nThe MIT License [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FBunlong%2Freact-papaparse","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FBunlong%2Freact-papaparse","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FBunlong%2Freact-papaparse/lists"}