跳到主要内容
SubtitleMatrix

CSV 转 JSON

或者粘贴字幕文本

这次转换会改变什么

这个方向不会丢失内容 —— 源格式的每一项特性在目标格式里都有地方可去。

这份清单来自这两种格式的能力矩阵,而不是你加载的这份具体文件。如果具体文件用到了格式允许、但矩阵没有建模的特性,可能会丢得更多。

这一页把 CSV 表格转成 JSON。输入一张表,输出一份结构化的字幕数据,正文与时间轴都在;转换在浏览器里完成,不上传。

这个方向不丢东西。CSV 能表达的每一件事 JSON 都有对应:时间轴、硬换行、文字。产物是一个对象,version 为 1,cues 数组里每条有 start、end(整数毫秒)和 lines;CSV 带 id 列时,那个 id 也会保留下来。

4.126 秒在 CSV 里写成 00:00:04.126,在 JSON 里是 4126,两者之间不四舍五入也不平移。原来显示 2.9 秒的字幕仍然是 2.9 秒,一条两行的字幕仍然是同一个 cue 里的两个元素。

CSV 的列按表头识别:start、end、text 可以写成 begin、finish、content 之类的别名,没有表头时按前三列顺序读;时间码里没加引号的逗号把一行拆成两列时,转换器会把两半拼回同一个时间码。

产物按起始时间升序,UTF-8、Unix 换行、无 BOM。整季可以一次拖入,串行处理,最后打包成一个 ZIP 下载。

示例

一份典型的 CSV 文件转成 JSON

输入

start,end,text
00:00:01.000,00:00:03.500,The quick brown fox.
00:00:04.000,00:00:06.250,"Jumps over, the lazy dog."
00:00:07.000,00:00:09.000,"Two lines here.
And a second one."

输出

{
  "version": 1,
  "cues": [
    {
      "start": 1000,
      "end": 3500,
      "lines": [
        "The quick brown fox."
      ]
    },
    {
      "start": 4000,
      "end": 6250,
      "lines": [
        "Jumps over, the lazy dog."
      ]
    },
    {
      "start": 7000,
      "end": 9000,
      "lines": [
        "Two lines here.",
        "And a second one."
      ]
    }
  ]
}

这一方向不丢东西:左右两栏可以逐行对照。

同一转换遇到一份脏文件

输入

id,start,end,note,text
1,00:00:01,000,00:00:04,000,cue one,"Hello there, friend."
2,00:00:05.000,00:00:07.000,cue two,Second line.
bad,notatime,00:00:09.000,cue three,Unreadable start.
4,00:00:10.000,00:00:09.000,cue four,End before start.
5,00:00:12.000,00:00:14.000,cue five,Unquoted comma in text, right here.

输出

{
  "version": 1,
  "cues": [
    {
      "id": "1",
      "start": 1000,
      "end": 4000,
      "lines": [
        "Hello there, friend."
      ]
    },
    {
      "id": "2",
      "start": 5000,
      "end": 7000,
      "lines": [
        "Second line."
      ]
    },
    {
      "id": "4",
      "start": 10000,
      "end": 10001,
      "lines": [
        "End before start."
      ]
    },
    {
      "id": "5",
      "start": 12000,
      "end": 14000,
      "lines": [
        "Unquoted comma in text, right here."
      ]
    }
  ]
}

真实文件里常见的损坏:混合换行、散落的空白、留空的字段。可以对照上面那份干净样例,看看解析器能容忍到什么程度。

常见问题

CSV 转 JSON 的产物是什么结构?

一个对象:version 为 1,cues 是数组,每条有 start 与 end(整数毫秒)和一个 lines 数组;CSV 有 id 列时每条还会带 id。外层没有转义过的字幕文本,正文就在 lines 里。

CSV 转 JSON 会丢时间精度吗?

不会。CSV 的 00:00:04.126 在 JSON 里就是 4126,两边都到毫秒;不四舍五入、不平移,2.9 秒的字幕仍然是 2.9 秒。

CSV 转 JSON 后,一条两行字幕怎么放?

放在同一个 cue 的 lines 数组里,两个元素。它们仍然属于同一条字幕,播放器会一起显示。

CSV 转 JSON 后,字幕顺序会变吗?

会按起始时间排一次,最早的在前。播放器和后续工具都按这个顺序读;CSV 原本乱序时,产物会被整理成升序,这是有意的结构整理。

CSV 转 JSON 之后,再转回 CSV 会丢什么?

会丢样式、屏幕定位与卡拉OK 计时,因为 CSV 没有地方放它们。CSV 转 JSON 这一趟本身不丢东西,代价要到回程才出现。

CSV 转 JSON 后,输入编码还看得出来吗?

产物固定是 UTF-8、Unix 换行、无 BOM。输入若是 UTF-16 或 Windows 单字节编码,会先解码再转换,结果面板会说明这次发生过解码。

相关工具