外部表和加载表

时间:2017-04-25 17:01:19

标签: google-bigquery

我收到此错误 "错误:解析从位置开始的行时检测到错误:4824。错误:遇到错误字符(ASCII 0)。"

数据未压缩。 我的外部表指向多个CSV文件,其中一个包含具有该字符的几行。在我的表定义中,我添加了" MaxBadRecords",但这没有效果。在常规表中加载数据时,我也遇到了同样的问题。

我知道我可以使用DataFlow甚至尝试修复CSV,但有没有替代方案,不包括编写解析器,希望同样简单有效?

3 个答案:

答案 0 :(得分:1)

  

是否有替代方案,不包括编写解析器,希望同样简单有效?

在Google Cloud SDK Shell(使用tr实用程序)

中尝试以下操作
gsutil cp gs://bucket/badfile.csv - | tr -d '\000' | gsutil cp - gs://bucket/fixedfile.csv   

这将

  1. 阅读你的"坏"文件
  2. 删除ASCII 0
  3. 保存"修复"文件到新文件
  4. 获得新文件后 - 只需确保您的表格现在指向固定的文件

答案 1 :(得分:0)

有时会在文件中出现最后一个字节。

多亏了:

tr '\0' ' ' < file1 > file2

答案 2 :(得分:0)

您可以使用 python 或 PowerShell 等外部工具清理文件。无法在 bigquery 中加载任何带有 ASCII0 的文件

这是一个可以用python清除文件的脚本:

def replace_chars(self,file_path,orignal_string,new_string):
    #Create temp file
    fh, abs_path = mkstemp()
    with os.fdopen(fh,'w', encoding='utf-8') as new_file:
        with open(file_path, encoding='utf-8', errors='replace') as old_file:
            print("\nCurrent line: \t")
            i=0
            for line in old_file:
                print(i,end="\r", flush=True)
                i=i+1
                line=line.replace(orignal_string, new_string)
                new_file.write(line)
    #Copy the file permissions from the old file to the new file
    shutil.copymode(file_path, abs_path)
    #Remove original file
    os.remove(file_path)
    #Move new file
    shutil.move(abs_path, file_path)

相同,但对于 PowerShell:

(Get-Content "C:\Source.DAT") -replace "`0", " " | Set-Content "C:\Destination.DAT"