YouTube转录文本格式转换Perl脚本异常问题求助
解决YouTube转录文本转CSV格式(时间戳+文本)
先明确转录文本的常见结构
YouTube下载的转录文本一般是这种格式:
1:35:35
对应的视频台词内容,可能包含多行换行
如果你的文本是时间戳单独一行、文本单独一行(含多行情况),下面的方案直接适用。
方案1:修正后的Perl脚本
之前脚本错位大概率是没处理好多行文本或时间戳与文本的配对逻辑,试试这个:
#!/usr/bin/perl use strict; use warnings; my ($timestamp, $prev_text); while (my $line = <>) { chomp $line; # 匹配时间戳:支持HH:MM:SS 或 MM:SS格式 if ($line =~ /^(\d+:\d+:\d+|\d+:\d+)$/) { # 先输出上一组的时间戳和文本 if (defined $timestamp && defined $prev_text) { # 转义CSV特殊字符,避免Excel导入出错 $prev_text =~ s/"/""/g; $prev_text =~ s/\n/ /g; # 把文本换行换成空格 print "\"$timestamp\",\"$prev_text\"\n"; } $timestamp = $line; $prev_text = ''; } else { # 累积多行文本内容 $prev_text .= ($prev_text ? ' ' : '') . $line if defined $timestamp; } } # 处理最后一组未输出的内容 if (defined $timestamp && defined $prev_text) { $prev_text =~ s/"/""/g; $prev_text =~ s/\n/ /g; print "\"$timestamp\",\"$prev_text\"\n"; }
使用步骤
- 把脚本保存为
yt_trans_to_csv.pl - 终端运行:
perl yt_trans_to_csv.pl 你的转录文件名.txt > 输出结果.csv
这个脚本的关键处理:
- 精准匹配两种常见时间戳格式
- 自动合并同一段台词的多行文本
- 转义逗号、双引号等CSV特殊字符,避免导入Excel时列错位
- 严格保证时间戳和文本一一对应
方案2:用awk替代sed(更适合行配对场景)
如果不想用Perl,awk处理这种行关联问题更顺手:
BEGIN { timestamp = "" text = "" } # 匹配时间戳行 /^([0-9]+:){1,2}[0-9]+$/ { if (timestamp != "" && text != "") { gsub(/"/, "\"\"", text) gsub(/\n/, " ", text) printf "\"%s\",\"%s\"\n", timestamp, text } timestamp = $0 text = "" next } # 累积文本内容 { if (timestamp != "") { text = text (text == "" ? "" : " ") $0 } } # 处理最后一组内容 END { if (timestamp != "" && text != "") { gsub(/"/, "\"\"", text) gsub(/\n/, " ", text) printf "\"%s\",\"%s\"\n", timestamp, text } }
使用步骤
- 把代码保存为
yt_trans.awk - 终端运行:
awk -f yt_trans.awk 你的转录文件名.txt > 输出结果.csv
之前脚本出错的常见原因
- 没处理文本多行的情况:YouTube转录中一段台词可能拆成多行,直接按行匹配会把文本行误判为新条目
- 缺失CSV转义:文本里的逗号、双引号会导致Excel导入时列错位
- 时间戳匹配规则不严谨:比如只匹配了HH:MM:SS,没覆盖MM:SS格式
内容的提问来源于stack exchange,提问作者capser
相关产品推荐
相关产品推荐

