Google bigquery 外部表和加载表时遇到Bigquery错误(ASCII 0)

Google bigquery 外部表和加载表时遇到Bigquery错误(ASCII 0),google-bigquery,Google Bigquery,我收到了这个错误 “错误:分析从位置4824开始的行时检测到错误。错误:遇到错误字符(ASCII 0)。” 数据没有被压缩。 我的外部表指向多个CSV文件,其中一个包含两行具有该字符的行。在我的表定义中,我添加了“MaxBadRecords”,但没有效果。在常规表中加载数据时,我也会遇到同样的问题。 我知道我可以使用DataFlow,甚至尝试修复CSV,但是有没有其他方法不包括编写解析器,并且希望同样简单高效 有没有一种替代方法不包括编写解析器,并且希望同样简单高效 在Google Cloud

我收到了这个错误
“错误:分析从位置4824开始的行时检测到错误。错误:遇到错误字符(ASCII 0)。”

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

我知道我可以使用DataFlow,甚至尝试修复CSV,但是有没有其他方法不包括编写解析器,并且希望同样简单高效

有没有一种替代方法不包括编写解析器,并且希望同样简单高效

在Google Cloud SDK Shell中尝试以下内容(使用实用程序)

这将

  • 阅读你的“坏”文件
  • 删除ASCII 0
  • 将“固定”文件保存到新文件中

  • 有了新文件后,只需确保您的表现在指向那个固定的文件,有时文件中会出现最后一个字节

    由于以下原因,替换它可能会有所帮助:

    tr '\0' ' ' < file1 > file2
    
    tr'\0'file2
    
    您可以使用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"
    

    看看其中一个是否有帮助:嗨,米哈伊尔。我有几个问题:如果旧文件和新文件的文件名相同怎么办?考虑到GCS bucket每小时都会与某个FTP服务器同步,所以同步过程会覆盖文件,我必须在之后运行该过程,那么它的速度会有多慢?我曾尝试使用sed命令,但由于每次同步时它都必须在所有文件上运行,因此速度非常慢,而且由于文件名相同,我收到一个错误,表示资源正忙,您只需尝试使用提取的ascii 0覆盖旧文件,然后看看它将如何为您工作:o)-请尝试。至于每小时一次的修复过程——老实说,我没有考虑过这种情况,因为我认为这只是一种坏文件的一次性情况——但您仍然可以尝试将修复过程作为与ftp同步的一部分(最后一步)。很难判断它会有多快/多慢,因为它取决于多个因素-同样,唯一的方法是尝试并试验您的文件,看看它是否会工作,但实际上,在考虑将此技巧作为每小时与ftp同步的一部分之前-我认为您应该首先检查此功能是否有效并解决此问题!你能试着确认一下吗?由于这主要是您问题的范围:o)对于较大的文件,这对我来说有点太慢了,所以我决定做避免的事情,我编写了一个数据流管道,从schema@Jordan-有道理!
    (Get-Content "C:\Source.DAT") -replace "`0", " " | Set-Content "C:\Destination.DAT"