导入文本文件时如何指定字段类型?(二)

博客聚焦于导入文本文件时指定字段类型的问题,虽未给出具体内容,但明确了核心问题,在信息技术领域,文件导入及字段类型指定是常见操作,对数据处理有重要意义。

导入文本文件时如何指定字段类型?

 

问题:

我有一个文本文件需要导入 Access ,但是文本文件中有一列数据原本是文本,但是导入数据库后自动变成了“双精度”类型,我该如何让各个字段按我需要的数据类型生成哪?
如何让 ACCESS 按照我规定的构架、规格从文本文件、XLS文档中导入数据?

 

方法二:

 Schema.ini 文件也可以达到要求。

作用:Schema.ini用于提供文本文件中记录的构架信息。每个 Schema.ini 项都用于指定表的五个特征之一:
1、文本文件名
2、文件格式
3、字段名、字段长度、字段类型
4、字符集
5、特别数据类型转换

指定文件名
文件名要用方括号括起来,例如如果要对 Sample.txt 使用数据构架信息文件,那么它的对应的项应该是

[Sample.txt]


指定文件格式

格式说明表格式Schema.ini 格式描述
Tab 制表符分隔文件中的字段用制表符分隔Format=TabDelimited
CSV 分隔文件中的字段用逗号来分隔Format=CSVDelimited
自定义分隔文件中的字段可以用任何字符来分隔,所有的字符都可以用来分隔,包括空格,但是双引号 ( " ) 除外

Format=Delimited(自定义分隔符)

- 或者没有分隔符 -

Format=Delimited( )

固定宽度文件中的字段为固定长度


指定字段

你可以有两种方法在一个字符分隔的文本文件中指定字段名

1、在文本文件中的第一行包含字段名,并且设置 ColNameHeader 为 True 。
2、用数字编号指定每一列并且指定每一列的名字以及数据类型

你必须用数字编号指定每一列并且指定每一列的名字、数据类型以及长度(在固定长度分隔的文本文件中需要指定长度)

注意,设定了 ColNameHeader 选项,在 Schema.ini 中 Windows 注册时会忽略 FirstRowHasNames 选项。

你也可以指定字段的数据类型,使用 MaxScanRows 选项用来指定在确定列的数据类型时要扫描多少行数据。设置 MaxScanRows 为 0 将扫描整个文件。

如果文本文件第一行包含字段名,并且要扫描整个文件,改项目就要定义如下:

ColNameHeader=True
MaxScanRows=0

接下来的项目用来指定表中的字段,使用列编号(Coln)选项来指定列。字段长度在“固定分隔文本文件中”是必填项目,在“字符分隔文本文件”中是可选项目。
示例:定义 2 个字段,CustomerNumber 是长度为 10 的文本字段、CustomerName 是长度为 30 的文本字段。

Col1=CustomerNumber Text Width 10
Col2=CustomerName Text Width 30

语法如下:
Coln=ColumnName type [Width #]

参数解释如下:

参数说明
ColumnName文本,标识字段名,如果包含空格要用双引号括起来
type

数据类型包括:

Microsoft Jet 数据类型:Bit Byte Short Long Currency Single Double DateTime Text Memo

ODBC 数据类型: Char (same as Text) Float (same as Double) Integer (same as Short) LongChar (same as Memo) Date date format

其中date format 是日期的格式字符串例如:Date YYYY-MM-DD

Width字符串的长度,后面的数字用来指定字段的长度(“固定分隔文本文件”为必填,“文字分隔文本文件”为可选)
#整形数字,标识字段长度

指定字符集
CharacterSet 项有两个选择:ANSI | OEM
选择 ANSI 字符集用如下方法:

CharacterSet=ANSI


特别数据类型转换 
特别数据类型转换主要是定义比如日期、货币型数据如何转换或者如何显示的,你可以参考下面这张表:

选项说明
DateTimeFormat
Can be set to a format string indicating dates and times. You should specify this entry if all date/time fields in the import/export are handled with the same format. All Microsoft Jet formats except A.M. and P.M. are supported. In the absence of a format string, the Windows Control Panel short date picture and time options are used.
DecimalSymbol
Can be set to any single character that is used to separate the integer from the fractional part of a number.
NumberDigits
Indicates the number of decimal digits in the fractional portion of a number.
NumberLeadingZeros
Specifies whether a decimal value less than 1 and greater than –1 should contain leading zeros; this value can either be False (no leading zeros) or True.
CurrencySymbol
Indicates the currency symbol to be used for currency values in the text file. Examples include the dollar sign ($) and Dm.
CurrencyPosFormat
Can be set to any of the following values:

· Currency symbol prefix with no separation ($1)

· Currency symbol suffix with no separation (1$)

· Currency symbol prefix with one character separation ($ 1)

· Currency symbol suffix with one character separation (1 $)

CurrencyDigits
Specifies the number of digits used for the fractional part of a currency amount.
CurrencyNegFormat
Can be one of the following values:

· ($1)

· –$1

· $–1

· $1–

· (1$)

· –1$

· 1–$

· 1$–

· –1 $

· –$ 1

· 1 $–

· $ 1–

· $ –1

· 1– $

· ($ 1)

· (1 $)

This example shows the dollar sign, but you should replace it with the appropriate CurrencySymbol value in the actual program.

CurrencyThousandSymbol
Indicates the single-character symbol to be used for separating currency values in the text file by thousands.
CurrencyDecimalSymbol
Can be set to any single character that is used to separate the whole from the fractional part of a currency amount.

 


下面给出一个简单的例子,假设有一个表Contacts.txt类似下面:

姓名 单位 联系日期 
王海 上海有机化学研究所 2002-1-1 
罗炙 数字化机床研究院 2004-1-1 

导入 Access 应该类似下面表格:

姓名单位联系日期
王海上海有机化学研究所2002-1-1
罗炙数字化机床研究院2004-1-1


那么 Schema.ini 则是类似下面的INI文件:

[Contacts.txt]
ColNameHeader=True
format=Delimited(" ")
MaxScanRows=0
CharacterSet=ANSI
Col1="姓名" Char Width 10
Col2="单位" Char Width 9
Col3="联系日期" Date Width 8

注释如下:

[Contacts.txt] ///文本文件名
ColNameHeader=True ///带有表头
format=Delimited( ) ///空格作为分隔符,如果是分号,请用format=Delimited(;) 来解决
MaxScanRows=0 ///扫描整个文件
CharacterSet=ANSI ///ANSI 字符集
Col1="姓名" Char Width 10 ///字段1
Col2="单位" Char Width 9 ///字段2
Col3="联系日期" Date Width 8 ///字段3
///如果有更多字段可 Col4 .... ColN 

注意,Schema.ini 必须和需要导入的文本文件在同一目录。

此后,我们就可以利用下面的语句来导入数据了:

CurrentProject.Connection.Execute "SELECT * INTO NewContact FROM [Text;FMT=Delimited;HDR=Yes;DATABASE=C:/;].[Contacts#txt];"

注意,到 2000 格式的 MDB 为止,以下语句都会导致导入失败,应该是 Access 本身的问题:
 Access XP / access 2003 出现不知道是否已经解决该问题,大家可以在“评论”中告诉我测试结果。

DoCmd.TransferText acImportFixed, , "Contacts", "C:/contacts.txt"

或者
DoCmd.TransferText acImportFixed, "C:/.ini", "Contacts", "C:/Documents.txt"


错误消息为:

运行时错误 '3625':
文本文件规范 'c:schema.ini' 不存在。不能使用规范进行导入、导出或者链接。

或者
运行时错误 '2511':
这个操作或方法需要一个 Specification Name 参数。

另外,请参考:
http://support.microsoft.com/default.aspx?scid=kb;en-us;241477

 

http://www.access911.net 站长收藏
<think>好的,我现在需要帮助用户解决Navicat导入CSV文件只有字段而没有数据的问题。首先,我需要回顾用户提供的引用内容,找出可能的原因和解决方法。 根据引用[1],当CSV某一列是科学计数格式导入到MySQL的datetime列会导致显示为0。这说明数据格式匹配可能导致数据无法正确导入。用户的问题虽然提到没有数据,但可能类似的格式问题导致数据被忽略或转换失败。 引用[2]提到日期分隔符的问题,如果间格式正确,比如使用斜杠而是连字符,Navicat可能无法正确解析日期,导致数据错误或导入失败。这可能也是数据无法导入的一个原因,特别是如果CSV中的日期间格式与数据库字段匹配的话。 引用[3]指出处理大数据量,Navicat可能只导入部分数据,但用户的问题是完全没有数据,这可能完全相关。过,可能存在数据行开始位置的问题,比如数据是否从第行开始,而第一行是字段名,如引用[2]提到的SQL STUDIO导出情况。如果数据行没有正确识别,可能导致Navicat认为没有数据可导入。 引用[4]提到字段对应关系,如果CSV的字段名与数据库匹配,可能需要手动调整映射关系,否则数据可能无法正确插入。用户的问题中字段存在,但数据没有,可能是因为字段映射错误,导致数据无法插入到正确的列,或者某些必填字段缺失,触发约束导致整个行被跳过。 接下来,我需要综合这些可能的原因,整理出逐步的解决方法。可能的原因包括:数据格式问题(如科学计数法、日期格式)、字段映射错误、数据起始行设置错误、空值或约束问题,以及编码问题。需要逐一检查这些方面,并提供对应的解决步骤。 另外,用户的问题可能需要具体操作指导,比如如何设置日期分隔符、调整字段映射、检查数据起始行等。同,要提醒用户注意数据中的特殊字符或隐藏空格,这些也可能导致导入失败。最后,建议在导入前进行小批量测试,以快速定位问题。</think>### Navicat导入CSV只有字段无数据的解决方法 #### 原因分析 1. **数据格式匹配** - 科学计数法或日期格式错误会导致整行数据被跳过(如`2022/10/15`需改为`2022-10-15`)[^1][^2] - 数据库字段类型与CSV数据格式一致(如文本型数字存入数值字段) 2. **字段映射错误** - CSV列名与数据库字段名完全匹配未手动建立对应关系[^4] - 数据库存在非空约束字段未提供数据 3. **数据起始行设置错误** - 若CSV第一行为字段名,需设置数据从第行开始 4. **空值或隐藏字符** - 数据行包含空值或可见字符(如换行符) --- #### 解决方案(逐步操作) 1. **检查数据格式** - **日期格式**:将`2022/10/15 6:30:36`改为`2022-10-15 06:30:36`,日期分隔符使用`-` - **科学计数法**:在CSV中将数值列强制设置为文本格式(如Excel中列前加单引号`'1.23E+5`) 2. **设置字段映射** - 在Navicat导入向导的「目标字段」界面,手动拖拽CSV列与数据库字段建立对应关系[^4] - 确保必填字段(如主键)在CSV中存在有效数据 3. **调整数据起始行** ```示例设置 源文件包含标题:✔️ 跳过行数:0 # 如果标题在第一行 数据起始行:2 # 数据从第行开始 ``` 4. **编码与分隔符设置** - 选择与CSV文件一致的编码(推荐`UTF-8`) - 分隔符类型选择「逗号」,文本识别符设为`"` 5. **验证数据完整性** - 用文本编辑器检查CSV是否有隐藏空格或换行符 - 使用`SELECT COUNT(*) FROM table`确认是否真的无数据,可能数据被导入到错误位置 --- #### 预防措施 - 导入前先用`LIMIT 100`测试小批量数据 - 使用预处理脚本统一数据格式(如Python的`pandas`库) - 数据库端设置宽松的字段类型(如用`VARCHAR`暂存原始数据)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值