ODBC到CSV文件,需要从Select语句中用Seperators拆分列

时间:2017-03-21 09:10:33

标签: sql csv odbc

在我的CSV文件中,我有包含以下值的列:

[Location]
1001-AAA-JOE A BLOGS-AAAA0000
1002-BBB-Michael J Jackson-BBBB0000
1003-AAA-Lewis Hamilton-AAAA0000

我需要将此列拆分为sperate列,这对于固定长度字段IE前两个部分和最后三个部分很容易,但中间的可变长度字段证明是困难的!

因此,在上面的示例中,我想获得一个名为NAME的列,其值为;

JOE A BLOGS 
Michael J Jackson 
Lewis Hamilton 

这可能吗?

这是我在select语句中到目前为止的内容;

选择*, 左([位置],InStr([位置],' - ') - 1)作为SITENUMBER, 左((中([位置],InStr([位置],' - ')+ 1)),InStr([位置],' - ') - 2)as牌, left(右([Location],8),2)AS RegionCode,left(right([Location],6),2)AS AreaCode, 左(右([位置],4),4)AS HubCode 来自[CSVExport.csv]

4 个答案:

答案 0 :(得分:0)

因此,使用连字符作为分隔符将输入字符串location拆分为标记,您需要获得第3个标记。

您没有提及您正在使用的DBMS。 ODBC可以连接到任何东西:Oracle,Teradata,Vertica,SQL Server,Informix,Postgres,Ingres,Hive,你可以命名它。

让我们保持乐观,并猜测您的DBMS支持SPLIT_PART()功能。

然后,试试这个:

WITH
input (location) AS (
          SELECT '1001-AAA-JOE A BLOGS-AAAA0000'
UNION ALL SELECT '1002-BBB-Michael J Jackson-BBBB0000'
UNION ALL SELECT '1003-AAA-Lewis Hamilton-AAAA0000'
)
SELECT 
  SPLIT_PART(location,'-',3) AS name
FROM input;

name
JOE A BLOGS
Michael J Jackson
Lewis Hamilton
select succeeded; 3 rows fetched

答案 1 :(得分:0)

这是基于SQL Server的示例。希望可以帮到你(在你的情况下你可以使用与INSTR类似的方法)。

SN                   BRAND                     NAME                                RegionCode AreaCode HubCode
-------------------- ------------------------- ----------------------------------- ---------- -------- -------
1001                 AAA                       JOE A BLOGS                         AA         AA       0000
1002                 BBB                       Michael J Jackson                   BB         BB       0000
1003                 AAA                       Lewis Hamilton                      AA         AA       0000

输出:

Import-Module ./tools/powershell/DhcpServer.psd1

答案 2 :(得分:0)

使用子串/ charindex为您提供更多选项。

最好转换为XML,但代码会更多。

Create Table #table (record VARCHAR(50))
Insert Into #table
VALUES ('1001-AAA-JOE A BLOGS-AAAA0000'), ('1002-BBB-Michael J Jackson-BBBB0000'), ('1003-AAA-Lewis Hamilton-AAAA0000')

Select 
SUBSTRING(SUBSTRING(record, CHARINDEX('-', record) + 5, 100) , 1, CHARINDEX('-', SUBSTRING(record, CHARINDEX('-', record) + 5, 100))-1) 'Name'
From #table

Select
SUBSTRING(x, 1, CHARINDEX('-', x) -1) 'Name'
From
(
    Select 
    SUBSTRING(record, CHARINDEX('-', record) + 5, 100) 'x'
    From #table
) y

答案 3 :(得分:0)

我尝试使用适用于Windows的ODBC数据管理工具odbcad32创建自定义CSV格式。

文件location.asc如下所示:

1001-AAA-JOE A BLOGS-AAAA0000
1002-BBB-Michael J Jackson-BBBB0000
1003-AAA-Lewis Hamilton-AAAA0000

odbcad32中,我添加了一个类型为“Microsoft Access Text Driver”的新数据源。配置它,我为location.asc指定了数据目录。然后我点击了[选项>>]按钮。在出现的窗口中,我添加了一个新的扩展名* .hsv。然后,我点击[Define Format ...]按钮。标记为location.asc后,我将下拉列表中的格式从CSV分隔更改为自定义分隔。我将分隔符指定为-,连字符。我没有检查[]列名称标题复选框。然后,我点击右侧的[Guess]按钮,自动获得F1到F4的字段。然后,我点击了3次[Ok],完全退出ODBCAD32。

有了这个,我可以连接到新的ODBC数据源。然后:

    SQL>select * from location.asc;
    F1   |F2 |F3               |F4
    1,001|AAA|JOE A BLOGS      |AAAA0000
    1,002|BBB|Michael J Jackson|BBBB0000
    1,003|AAA|Lewis Hamilton   |AAAA0000

这可能是你的解决方案吗?