如何将含多行描述的TXT文件导入Google BigQuery?
我来帮你搞定这个带多行描述的TXT文件导入BigQuery的问题——这种字段里嵌换行的文件确实容易让常规导入逻辑翻车,给你两个实用的方案,按需选就行:
方案1:先预处理文件(推荐,操作更直观)
你的每条记录都是以「ID|平台|描述开头」这种带两个|的行启动的,后面的换行都是描述内容的一部分。我们可以用awk把每条记录合并成单行,把描述里的换行换成转义的\n(或者你喜欢的其他占位符),等导入BigQuery后再还原回去。
直接在终端运行这个awk命令处理你的TXT文件:
BEGIN { prev_record = "" } { if ($0 ~ /\|.*\|/) { # 判断当前行是不是新记录的开头(包含两个|) if (prev_record != "") { print prev_record # 输出上一条完整记录 } # 拆分当前行的ID、平台和描述开头 split($0, parts, /\|/) prev_record = parts[1] "|" parts[2] "|" substr($0, length(parts[1]) + length(parts[2]) + 3) } else { # 把当前行追加到上一条记录的描述里,用转义\n代替换行 prev_record = prev_record "\\n" $0 } } END { print prev_record # 输出最后一条记录 }
处理完之后,你的文件里每条记录都会变成单行,接下来就可以用BigQuery的常规流程导入:
- 在BigQuery控制台创建目标表,定义三个字段:
id(STRING类型)、platform(STRING类型)、description(STRING类型) - 选择处理好的文件,设置分隔符为
|,完成导入 - 如果需要把描述里的转义
\n还原成真实换行,执行这条SQL就行:
UPDATE `你的项目.你的数据集.你的表` SET description = REPLACE(description, '\\n', '\n') WHERE TRUE;
方案2:直接用BigQuery外部表处理(不用改原文件)
要是不想碰原文件,也可以通过外部表+SQL来合并多行记录:
- 先把原始TXT文件上传到Google Cloud Storage(GCS)
- 在BigQuery里创建外部表,格式选
TEXT,字段分隔符随便挑一个你文件里肯定不会出现的字符(比如~),这样BigQuery会把每一行都当成一个叫raw_line的字段 - 运行下面的SQL来合并记录并拆分字段:
WITH numbered_records AS ( SELECT raw_line, -- 给每条记录分配唯一ID:每遇到带两个|的行,ID就+1 SUM(IF(raw_line LIKE '%|%|%', 1, 0)) OVER (ORDER BY _FILE_NAME, _OFFSET) AS record_group_id FROM `你的项目.你的数据集.你的外部表` ), combined_raw AS ( SELECT record_group_id, -- 把同组的行用换行符拼起来,还原完整记录 STRING_AGG(raw_line, '\n' ORDER BY _OFFSET) AS full_record FROM numbered_records GROUP BY record_group_id ), split_fields AS ( SELECT -- 拆分ID和平台,用正则处理避免描述里有|的情况 REGEXP_EXTRACT(full_record, r'^([^|]+)\|([^|]+)\|') AS id, REGEXP_EXTRACT(full_record, r'^[^|]+\|([^|]+)\|') AS platform, -- 提取第三个|之后的所有内容作为描述 REGEXP_REPLACE(full_record, r'^[^|]+\|[^|]+\|', '') AS description FROM combined_raw ) SELECT * FROM split_fields
这个SQL会自动把属于同一条记录的多行合并,然后拆分出三个字段,你可以把结果保存成正式表。
小提醒
如果你的描述字段里可能出现|字符,那方案1里用|做分隔符就会出问题——这时候预处理时可以换成更特殊的分隔符(比如###),或者直接用方案2的正则拆分方式,更稳妥。
内容的提问来源于stack exchange,提问作者arcee123
相关产品推荐
相关产品推荐

