我是Azure数据湖分析的新手,我正在尝试加载csv,该csv用双引号表示,并且某些随机行的列中有引号。
例如
ID, BookName
1, "Life of Pi"
2, "Story about "Mr X""
当我尝试加载时,它在第二条记录上失败并抛出错误消息。
1,我想知道是否有办法在csv文件中解决此问题,但是很遗憾,由于这些是日志文件,我们无法从源代码中提取新文件?
2,是否可以让ADLA忽略不良行并继续处理其余记录?
执行失败,出现错误'1_SV1_Extract错误: '{“ diagnosticCode”:195887146,“严重性”:“错误”,“组件”:“ RUNTIME”,“源”:“用户”,“ errorId”:“ E_RUNTIME_USER_EXTRACT_ROW_ERROR”,“消息”:“错误 在处理9045条记录后提取行时发生 顶点的输入分割。列索引:9,列名: 'instancename'。“,” description“:”“,” resolution“:”“,” helpLink“:”“,” details“:”“,” internalDiagnostics“:”“,” innerError“:{” diagnosticCode“: 195887144,“严重性”:“错误”,“组件”:“ RUNTIME”,“源”:“用户”,“ errorId”:“ E_RUNTIME_USER_EXTRACT_EXTRACT_INVALID_CHARACTER_AFTER_QUOTED_FIELD”,“消息”:“无效 引号中结尾引号后面的字符 字段。“,”描述“:”在 带引号的字段中的结束引号字符。列定界符,行 定界符或EOF预期。\ n如果双引号引起此错误 内的字段未正确转义为两个 双引号。“,” resolution“:”列应完全用 字段中的双引号和双引号转为两个 双引号。”
答案 0 :(得分:1)
根据错误消息,如果要导入带引号的csv(在某些列中包含引号),则需要将其转义为两个双引号。在您的特定示例中,第二行需要为:
..."Life after death and ""good death"" models - a qualitative study",...
因此,一种选择是修复输出中的原始文件。如果您无法执行此操作,则可以将所有列导入为一列,使用RegEx固定引号并再次输出文件,例如
// Import records as one row then use RegEx to clean columns
@input =
EXTRACT oneCol string
FROM "/input/input132.csv"
USING Extractors.Text( '|', quoting: false );
// Fix up the quotes using RegEx
@output =
SELECT Regex.Replace(oneCol, "([^,])\"([^,])", "$1\"\"$2") AS cleanCol
FROM @input;
OUTPUT @output
TO "/output/output.csv"
USING Outputters.Csv(quoting : false);
文件现在将成功导入。我的结果: