如何将 CSV 导入 sanity.io

Posted

技术标签:

【中文标题】如何将 CSV 导入 sanity.io【英文标题】:How to import CSV to sanity.io 【发布时间】:2018-05-27 03:29:00 【问题描述】:

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

尝试将数据上传/导入我的项目时遇到问题:有没有办法从 csv 文件导入数据?文档中的示例仅解释 json 文件:https://www.sanity.io/docs/content-studio/importing-data

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

谁能帮我理解我应该怎么做hit?

【问题讨论】:

【参考方案1】:

目前无法将数据直接从 CSV 文件导入到 Sanity。尽管如此,实现你想要的还是很简单的。简而言之,这是您想要做的事情:

    解析 CSV 文件 构造传入数据以匹配您的架构 将新文档写入以换行符分隔的 JSON 文件 将该文件导入 Sanity

假设您的名为 studios.csv 的 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 标志),而不会出现重复。

【讨论】:

以上是关于如何将 CSV 导入 sanity.io的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 gatsby-source-sanity 在 sanity.io 和 gatsby 中使用内部链接?

如何使用 sanity.io 在字段中创建默认值?

如何定义 NOT 是 sanity.io 结构构建器?

如何在 sanity.io 中为文档创建默认的“creationDate”?

如何在 Sanity.io 的 inputComponent 中检索引用的字段数据?

在 sanity.io 中自定义模式字段