我该如何用子字符串分隔此文本?

时间:2019-10-01 02:38:13

标签: sql ssms

我有一个包含这样的数据的平面文件(请注意,每个行=一行,并且全部在1个字段中,这就是为什么我使用子字符串将其分离出来并使用格式更好的数据制作新表的原因) :

011000015O0110000150122415000000000FEDERAL RESERVE BANK                1000 PEACHTREE ST N.E.              ATLANTA             GA303094470877372245711     
011000028O0110000151072811000000000STATE STREET BANK AND TRUST COMPANY JAB2NW                              N. QUINCY           MA021710000617664240011     
011000138O0110000151101310000000000BANK OF AMERICA, N.A.               8001 VILLA PARK DRIVE               HENRICO             VA232280000800446013511    

我正在尝试将其分开;但是,我不知道如何在SUBSTRING函数中找到第一个非整数数字。我正在分析这些数据。到目前为止,我已经分离了我需要的该数字序列的前2个部分;但是,我很难找到一种区分银行名称(FEDERAL RESEVE BANK)开头的好方法。名称开始之前似乎是35个整数,但是,如何找到名称的长度?

我真的只需要帮助,直到银行名称,即“联邦储备银行”。之后,我希望可以解决其余的问题。

SELECT 
    SUBSTRING(FIELD1, 0,10) ROUTING_NUMBER,
    SUBSTRING(FIELD1,11,9) FEDRESERVE_NUM,
    SUBSTRING(FIELD1,
FROM srcFlatFile.dbo.fedachdir2018

这就是我需要的(“ O”不需要它自己的列,并且现在不需要'000000000'和'122203950'):

011000015 O 011000015 0122415 000000000 FEDERAL RESERVE BANK                1000 PEACHTREE ST N.E.              ATLANTA             GA 30309-4470 8773722457 11     
011000028 O 011000015 1072811 000000000 STATE STREET BANK AND TRUST COMPANY JAB2NW                              N. QUINCY           MA 02171-0000 6176642400 11     
011000138 O 011000015 1101310 000000000 BANK OF AMERICA, N.A.               8001 VILLA PARK DRIVE               HENRICO             VA 23228-0000 8004460135 11    

2 个答案:

答案 0 :(得分:0)

您所拥有的是固定宽度文件导出。谁向您提供文件,谁都应该给您一个导入说明,但听起来好像他们没有为您这样做。但是,这不是“所有领域”。只是字段设置了长度,如果有规范,规范会告诉您将其分解的位置。

最简单的方法是使用SSIS,或者,如果是一次性导入,则使用“导入数据”向导(据记录,该向导只是向您编写一个SSIS包;您应该使用“将软件包保存到文件系统”选项,因为我从未见过“一次性”导入仅发生过一次)。然后,将数据保存在表中后,就可以进行其他操作。

希望您知道前五列是什么,但是其余的说明很不言自明:

+-------------------+--------+
|       Name        |  Width |
+-------------------+--------+
| Column1           |      9 |
| Column2           |      1 |
| Column3           |      9 |
| Column4           |      7 |
| Column5           |      9 |
| BankName          |     36 |
| BankAddy          |     36 |
| BankCity          |     20 |
| BankStateCd       |      2 |
| BankZip           |      9 |
| BankAreaCode      |      3 |
| BankPhone         |     10 |
| BankCountryPrefix |      2 |
+-------------------+--------+

该地址实际上可能是两个18个字符的列,但是从示例数据来看,它看起来只是一个更大的列。

答案 1 :(得分:0)

尝试使用此Substring方法(长度已硬编码)

IF OBJECT_ID('Sampletable') IS NOT NULL 
    DROP TABLE Sampletable 
GO

CREATE TABLE Sampletable 
(
Samples VARCHAR(100)
)
GO

INSERT INTO Sampletable VALUES 
('011000015O0110000150122415000000000FEDERAL RESERVE BANK'),
('011000028O0110000151072811000000000STATE STREET BANK AND TRUST COMPANY'),
('011000138O0110000151101310000000000BANK OF AMERICA, N.A.')

SELECT SUBSTRING (Samples,1,9) AS [1],SUBSTRING (Samples,10,1) AS [2],
SUBSTRING (Samples,11,9) AS [3],SUBSTRING (Samples,20,7) AS [4],
SUBSTRING (Samples,27,9) AS [5],REPLACE(Samples,SUBSTRING(Samples,1,35),'') AS [6]
FROM Sampletable