BigQuery无法从tshark导入CSV

BigQuery无法从tshark导入CSV,csv,awk,google-bigquery,Csv,Awk,Google Bigquery,目前,我让tshark记录所有符合特定消息传递标准的数据包,并将它们输出到CSV中。然后将CSV存储在Google CloudStorage上,以便导入到BigQuery中 这是tshark输出的CSV中的一个示例行 "1380106851.793056000", "1.1.1.1", "2.2.2.2", "99999", "1111", "raw:ip", "324", "af:00:21:9a", "880", "102", "74:00", "ORIG", "It's text or !

目前,我让tshark记录所有符合特定消息传递标准的数据包,并将它们输出到CSV中。然后将CSV存储在Google CloudStorage上,以便导入到BigQuery中

这是tshark输出的CSV中的一个示例行

"1380106851.793056000",
"1.1.1.1",
"2.2.2.2",
"99999",
"1111",
"raw:ip",
"324",
"af:00:21:9a",
"880",
"102",
"74:00",
"ORIG",
"It's text or !\x0a\" 's not D",
"0x00",
"0",
BigQuery不会导入这一行,声称“关闭双引号(“)和字段分隔符之间的数据:字段以:”。我假设是第13列(“它是文本或!\x0a\””不是D)导致了此问题,但我不确定如何否定它。此列包含消息文本,可以合理地假设它可能永远不包含平衡语法

我能想到的唯一补救办法是在文件上运行awk,并用单引号替换任何非语法双引号


有什么我遗漏的吗?

我不知道为什么tshark会用反斜杠转义双引号,但是根据,它们应该用双引号引用:

“字段中的(双)引号字符必须由两个字符表示 (双引号)字符。“

BigQuery将愉快地接受以下方式转义的报价:

  • 不起作用:“它是文本或!\x0a\”不是D”
  • 作品:“这是文字或文字\x0a“不是D”

有没有办法告诉tshark如何恰当地转义CSV?否则,如果引用RFC标准,我打赌这将是一个受欢迎的补丁。此外,如果必要的话,这个替代转义机制可以作为BigQuery功能实现(我猜这个问题中的投票可以作为衡量需要多少的指标).

您可以更改BigQuery配置的
配置.load.fieldDelimiter
配置.load.quote
属性吗?如果可以,我会尝试使用类似
\001
的字符(或其他一些“永远不会显示”的字符)在CSV创建和数据加载上进行定界。同时,需要在两端关闭数据的双引号。到目前为止,我只在GUI中使用了job creator-但我将进行自定义测试。消息数据由用户生成,因此几乎肯定会包含大量随机字符。我只需要避免d它转义了引号。试图重现:我在示例中看到了多行,而不是多列。原始格式是什么?抱歉,我添加了换行符,以便直观。分隔符是逗号,原始帖子中的所有文本都是单行(删除换行符).我已经设法让sed使用以下命令将双引号中的所有双引号替换为单引号;sed-e“s/\”\“\”/”/g“inputfile.csv-iBigQuery似乎对此没有问题。这样,我可以在上传文件之前轻松地将其合并到shell脚本中。很遗憾BigQuery似乎无法处理MySQL这样的列。发现问题:引号不应该像这样引用\“,而是像这样引用”“-下面是完整答案谢谢你的回答,这完全有道理,但我不确定是否是tshark在逃避引用。内容可能与原始数据包中的内容相同。我将检查是否再次出现这种情况,并将其与原始PCAP交叉引用。如果是原始数据包内容,我想我可能需要在导入之前用sed对其进行迭代以调整内容确实存在,但根据RFC 4180,它没有被转义。事实上,它根本没有被转义。斜杠也是数据包中原始文本的一部分。由于BigQuery遵循RFC,它可能必须是tshark的补丁?没有多少CSV解析器可以处理格式错误,因此一旦写入,就很难修复。是的,tshark需要以某种方式处理转义,这样我们才能获得有效的CSV。奇怪的是,这还没有得到处理。你尝试过吗?我将在那里发布一篇文章。同时,我发现PHP的str_getcsv将读取不符合要求的CSV。从那里,你可以使用fputcsv对其进行操作并重写,这将准备一个BigQuery没有问题的CSV另外,我注意到您不能从Cron运行的脚本调用任何CloudSDK实用程序,因为所需的实用程序可以解决这个问题。谢谢您的帮助:)