如何将 CSV 文件导入 sanity.io
How to import CSV to sanity.io
我是一名业余程序员,正在探索新的无头 CMS sanity 的免费版本 (www.sanity.io)。
尝试将数据上传/导入我的项目时遇到问题:有没有办法从 csv 文件导入数据?文档中的示例仅解释 json 个文件:https://www.sanity.io/docs/content-studio/importing-data
我不解释我自己的项目,而是以捆绑的电影制片厂为例:假设我想添加一个信息层,即哪个电影制片厂制作了电影。我有一个包含工作室列表的 CSV 文件,列是名称、国家/地区、网页、CEO、电影。其中最终是一个包含电影名称的数组 studio.I 想要导入此 CSV 以创建一个新的内容类型是工作室,其中填充了工作室列表,并且电影数组是引用,而不是文本.
任何人都可以帮助我了解我应该如何进行打击吗?
目前无法将数据直接从 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
标志),而不会重复。
我是一名业余程序员,正在探索新的无头 CMS sanity 的免费版本 (www.sanity.io)。
尝试将数据上传/导入我的项目时遇到问题:有没有办法从 csv 文件导入数据?文档中的示例仅解释 json 个文件:https://www.sanity.io/docs/content-studio/importing-data
我不解释我自己的项目,而是以捆绑的电影制片厂为例:假设我想添加一个信息层,即哪个电影制片厂制作了电影。我有一个包含工作室列表的 CSV 文件,列是名称、国家/地区、网页、CEO、电影。其中最终是一个包含电影名称的数组 studio.I 想要导入此 CSV 以创建一个新的内容类型是工作室,其中填充了工作室列表,并且电影数组是引用,而不是文本.
任何人都可以帮助我了解我应该如何进行打击吗?
目前无法将数据直接从 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
标志),而不会重复。