如何将CSV文件导入到sanity.io

3

我是一名业余程序员,正在探索新的无头CMS Sanity(www.sanity.io)的免费版本。

当尝试将数据上传/导入到我的项目时遇到问题:是否有一种方法可以从CSV文件中导入数据?文档示例只解释了JSON文件:https://www.sanity.io/docs/content-studio/importing-data

让我们以捆绑电影工作室为例,而不是解释我的项目:假设我想添加一个信息层次,即哪个电影工作室制作了这些电影。我有一个带有工作室列表的CSV文件,其中列分别为名称、国家、网页、首席执行官、电影。最后一个是该工作室电影名称的数组。我想导入此CSV创建一个名为“studio”的新内容类型,其中填充了工作室列表,并且电影数组是引用而不是文本。

有人可以帮助我理解如何去做吗?

1个回答

7
目前还没有一种直接从CSV文件导入数据到Sanity的方法。但是,实现你想要的功能非常简单。简而言之,你需要做以下几个步骤:
  1. 解析CSV文件
  2. 将输入数据结构化以匹配你的模式
  3. 将新文档写入一个以换行符分隔的JSON文件中
  4. 将该文件导入到Sanity中
假设你的CSV文件名为studios.csv,看起来像这样:
NAME,WEBPAGE,MOVIES
Paramount,paramountstudios.com,Ghost in the Shell;Arrival
DreamWorks,dreamworksstudios.com,Ghost in the Shell;Minority Report;Transformers

下面的代码使用了csv-parser,但如果你想使用其他的CSV解析包,它仍然可以作为一个示例。
const csv = require('csv-parser')
const fs = require('fs')
const sanityClient = require('@sanity/client')
const client = sanityClient({
  projectId: 'my-project-id',
  dataset: 'my-dataset',
  useCdn: false
})

function appendToFile(document) {
  const docAsNewLineJson = `${JSON.stringify(document)}\n`
  fs.appendFileSync('ready-for-import.ndjson', docAsNewLineJson, {flag: 'a+'})
}

function moviesByTitles(titles) {
  return client.fetch('*[_type == "movie" && title in $titles]', {titles: titles})
}

fs.createReadStream('studios.csv')
  .pipe(csv())
  .on('data', data => {
    // Assuming movie titles are semi-colon separated
    const titles = data.MOVIES.split(';')
    // Fetch movies with these titles 
    moviesByTitles(titles).then(movies => {
      // Build a Sanity document which matches your Studio type
      const document = {
        _type: 'studio',
        name: data.NAME,
        webPage: data.WEBPAGE,
        movies: movies.map(movie => {
          return {
            _ref: movie._id,
            _type: 'reference'
          }
        })
      }
      // Append the document to a file for later import
      appendToFile(document)  
    )}
  })

您将得到文件 ready-for-import.ndjson,其中包含准备好导入的Sanity文档,现在您可以简单地执行以下操作:
sanity dataset import ready-for-import.ndjson <my-dataset>

在每个工作室中包含一个具有唯一且非随机值的_id字段可能会证明很有用,例如studio_${data.NAME.toLowerCase().replace(' ', '-')}。这将允许您多次导入文档(使用--replace标志),而不会出现重复。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接