SQL导入管道与一些已记录管道的数据字段分隔

时间:2015-01-30 17:50:09

标签: sql sql-server sql-server-2008-r2

我目前在SQL中使用批量插入来导入管道(|)分隔,这非常简单。我遇到的问题有时会有包含管道(|)的记录,然后将返回批量插入将其分解为两个不同的记录。以下是一个例子

12343|First Name|Last Name| Address field|Location
63494|Second First Name|Second Last Name| Address Field with | in it |location

上面的例子,第二条记录,批量插入将拆分地址字段,因为它包含一个|。我有什么建议可以用来避免这样的问题吗?

由于

1 个答案:

答案 0 :(得分:2)

我之前和从我的经历中遇到了同样的问题,在导入过程中你无能为力。显然,如果您在导出过程中有任何控制权来源,您可以在此时处理数据清理,最有可能购买不是您的情况。至少在导入过程中可以做的一件事就是在批量插入之前验证输入文件,就像我用这样的简单代码一样:

    public class ValidateMigrationFile {

    private static final String REGEX = "^([^|]*\\|){50}[^|]*$";

    public static void testFile(String fileName) {

        int lineCounter = 1;
        int totalErrors = 0;

        try {

            BufferedReader br = new BufferedReader(new FileReader(fileName));

            String line = null;

            while ((line=br.readLine())!=null) {

                // Validate the line is formatted correctly based on regular expressions                
                if (!line.matches(REGEX)){
                    System.out.println("Invalid format on line " + lineCounter + " (" + line + ")");
                    totalErrors++;
                }

                lineCounter++;
            }
            br.close();
            System.out.println("Total rows processed: " + --lineCounter);
            System.out.println("Total errors found: " + totalErrors);


        } catch (Exception ex) {
            System.out.println("Exception occurred: " + ex.toString());
        }
    }
}

通过这种方式,您可以提前检测文件是否格式正确,并准确检测出哪些行存在问题。