我有一个有600万行的CSV文件。每一行都由相同的格式组成,例如/
I,h,q,q,3,A,5,Q,3,[,5,Q,8,c,3,N,3,E,4,F,4,g,4,I,V,9000,0000001-100,G9999999990001800000000000001,G9999999990000001100PDNELKKMMCNELRQNWJ010, , , , , , ,D,Z我在一个表中有两列。
第一列应该是CSV中的字段27,第二列应该是CSV文件中的整行。
我已尝试设置格式化文件,但无法使其正常工作。
有没有可能做这种映射呢?
这就是我所拥有的:
BULK INSERT Staging FROM 'C:\Data.txt'
WITH
(
FIELDTERMINATOR =',',
ROWTERMINATOR ='\n',
KEEPNULLS,
formatfile='C:\format.fmt'
)这是我的格式化文件
9.0
2
1 SQLCHAR 0 40 "," 27 Col27 SQL_Latin1_General_CP1_CI_AS
2 SQLCHAR 0 200 "\r\n" 1 Col1 SQL_Latin1_General_CP1_CI_AS就比较而言,我在SQLite中工作,需要2分35秒。
发布于 2011-11-11 04:57:20
你可以用几种方法解决这个问题,但我的方法是通过动态SQL将整个csv文件大容量插入到临时表中:
CREATE TABLE #BulkLoadData(
RecordData NVARCHAR(max)
)
SET @SQL = 'BULK INSERT #BulkLoadData FROM ''' + @SourceFileFullPath + ''' '
SET @SQL = @SQL + 'WITH (FORMATFILE = ''' + @UPXInputFileBulkLoadFormat + 'UPXInputFileBulkLoadFormat.xml'', TABLOCK, ROWS_PER_BATCH = 2500 ) '
EXECUTE (@SQL)然后,您可以像这样将数据插入到目标表中:
INSERT INTO dbo.TargetTable
SELECT dbo.fnParseString(27, ',', RecordData), RecordData您需要像这样创建一个解析函数:
CREATE FUNCTION [dbo].[fnParseString]
(
@Section SMALLINT,
@Delimiter CHAR,
@Text VARCHAR(MAX)
)
RETURNS VARCHAR(8000)
AS
BEGIN
DECLARE @startindex NUMERIC(18,0),
@length NUMERIC(18,0),
@FieldPosition INT
SET @FieldPosition = ABS(@Section) - 1
SET @startindex = 0
WHILE @FieldPosition != 0
BEGIN
SET @FieldPosition = @FieldPosition - 1
SET @startindex = CHARINDEX(@Delimiter, @Text, @startindex + 1)
END
SET @Text = SUBSTRING(@Text, @startindex + 1, LEN(@Text) - @startindex)
SET @Text = SUBSTRING(@Text, 0, CHARINDEX(@Delimiter, @Text))
RETURN @Text
END希望这能有所帮助!如果您需要格式化文件的帮助,请让我知道。
格式文件内容如下:
<?xml version="1.0"?>
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<RECORD>
<FIELD ID="1" xsi:type="CharTerm" TERMINATOR="\n" MAX_LENGTH="8000" COLLATION="SQL_Latin1_General_CP1_CI_AS"/>
</RECORD>
<ROW>
<COLUMN SOURCE="1" NAME="RecordData" xsi:type="SQLVARYCHAR"/>
</ROW>
</BCPFORMAT>https://stackoverflow.com/questions/8085961
复制相似问题