vba去oracle数据后乱码,vba中读取utf-8文件乱码问题
现象:
从linux中通过sh生成一个csv文件,该文件的格式是utf-8,(我的操作系统为日文XP,文字编码为shift_jis)
⇒用excel直接打开,文件乱码。
⇒在access中使用原来的文件读取方式,不能正确读取。
调查:
----------------------------------------------------------------------------------
原先的读取方式为:
’注意1:要使用FileSystemObject,需要在[参照设定]中添加[microsoft excel 11.0
object library]
Dim fso
As New FileSystemObject
Dim f1 As
File
Dim ts As
TextStream
Set f1 =
fso.GetFile(filePath)
Set ts =
f1.OpenAsTextStream(ForReading)
'↓↓↓↓↓也可以用OpenTextFile的方式-↓↓↓↓↓
'Dim stmFile
'Dim strText As String
'Set stmFile = fso.OpenTextFile(filePath, ForReading, False)
'…
'strText = stmFile.ReadLine
'…
'stmFile.Close
'↑↑↑↑↑也可以用OpenTextFile的方式↑↑↑↑↑
Do Until
ts.AtEndOfStream
lineBuffer = ts.ReadLine
columnData = Split(lineBuffer, ",")
…
Loop
ts.Close
Set ts =
Nothing
Set f1 =
Nothing
Set fso =
Nothing
’注意2:其实在使用FileSystemObject作为打开文件处理之前,使用的是下面的文件读取方式(Line Input
)。这种方式,在文件的改行code为"CRLF"的时候没有问题,但是区别不了"LF"改行code,所以预想的是行读取变成了整个文件读取。使用FileSystemObject就可以解决。
********************************************
'Dim
fileNo As Long
'Open
filePath For Input Access Read Lock Write As #fileNo
' Do Until EOF(fileNo)
' Line Input #fileNo, lineBuffer
' columnData = Split(lineBuffer, ",")
' …
' Loop
'Close
#fileNo
********************************************
----------------------------------------------------------------------------------
解决方案1. 下载免费的转换工具进行转。
解决方案2. 通过access的[外部数据读入],在其中的某一步骤的时候,可以设置import定义体的读取格式(本例的案例就可以设为utf-8),然后保存到某个数据表中。
解决方案3.使用原先的文件读取方式+
使用[ADODB.Stream]:
(注意:这是网上说的较多的方案,但我实际检验之后发现并不能完全转换。写在这里权当参考)
(注意:使用[ADODB.Stream],需要在[参照设定]中添加[microsoft activex
data object 2.5
library]以上版本)
’对上面的文件读取方式取得的每一行数据进行变换
lineBuffer = tran_ado(lineBuffer, "utf-8",
"shift_jis")
’转换函数
Function tran_ado(ByVal strA As String, _
Optional ByVal strInCode As String = "utf-8", _
Optional ByVal strOutCode As String = "Shift-JIS") As String
' Microsoft ActiveX Data Objects 2.5 Library
Dim Stm
As New
ADODB.Stream Stm.Type =
adTypeText
Stm.Mode =
adModeUnknown
Stm.Open
Stm.Charset
= strOutCode
Stm.WriteText strA
Stm.Position
= 0
Stm.Type =
adTypeText
Stm.Charset
= strInCode
tran_ado =
Stm.ReadText()
Stm.Close
End Function
解决方案4(本例的最终解决方案).下记的文件读取方式 +
使用[ADODB.Stream]:
Dim ts As
ADODB.Stream Set ts = New
ADODB.Stream ts.Type = adTypeText
ts.Charset = "UTF-8"
'改行code根据文件而定
ts.LineSeparator = adLF
ts.Open
'文件装载
ts.LoadFromFile
(filePath) Do While Not (ts.EOS)
'行读取:ReadText(adReadLine)
'全文件读取:ReadText(adReadAll) lineBuffer = ts.ReadText(adReadLine)
…
Loop
■事例
Sub readLogfile(ByVal Target As Range)
Dim
iFileName As String
Dim
ts As ADODB.Stream '★【ツール\参照設定】で【microsoft activex data object 2.5
library】バージョン以上追加設定要
Dim
lineBuffer As String
Dim
userIdDic As
Dictionary '★【ツール\参照設定】で【microsoft Scripting runtime】バージョン以上追加設定要
Dim
lvArr As Variant
Dim
lsReadDate As String
Dim
iPrtRow As Long
'対象日付を読込
lsReadDate =
Cells(Target.Row + 1,
Target.Column) 'ユーザID出力開始行
iPrtRow =
Target.Row +
3 iFileName =
Application.GetOpenFilename
If iFileName
= "False" Then
'MsgBox "読込対象ログファイルを選択してください。"
Else
wz = InStrRev(iFileName, "\")
Path = Left(iFileName, wz)
fname = Right(iFileName, Len(iFileName) - wz)
'MsgBox "読込対象:" & fname & vbCrLf & "パス:" & Path
'---------読込開始-----------
Set ts = New ADODB.Stream
ts.Type =
adTypeText '★文字コードによって設定
ts.Charset = "UTF-8"
ts.LineSeparator =
adLF '★改行コードによって設定
ts.Open
'ファイルロード
ts.LoadFromFile (iFileName)
Do While Not (ts.EOS)
'行読込:ReadText(adReadLine)
'全文読込:ReadText(adReadAll)
lineBuffer = ts.ReadText(adReadLine)
If (IsNull(lineBuffer) Or IsEmpty(lineBuffer) Or lineBuffer = "")
Then
Else
lvArr = Split(lineBuffer, ",")
If (UBound(lvArr) > 5) Then
If (lvArr(1) = lsReadDate) Then
'重複なしのユーザIDの格納
vba去oracle数据后乱码,vba中读取utf-8文件乱码问题相关推荐
- oracle 导入电子表格,oracle数据导入到电子表格中
oracle数据导入到excel中 实现步骤: 1.连入SQL*Plus 以system/manager用户登录, SQL> conn system/manager 创建新的用户:如user1/ ...
- 计算机目录读取,从项目目录中读取SQL查询文件(Read SQL query file from project directory)...
从项目目录中读取SQL查询文件(Read SQL query file from project directory) 我在Visual Studio项目中放置了3个特别大的SQL查询,位于项目目录中 ...
- sublime python3中读取和写入文件时如何解决编码问题
sublime python3中读取和写入文件时如何解决编码问题 参考文章: (1)sublime python3中读取和写入文件时如何解决编码问题 (2)https://www.cnblogs.co ...
- C#中读取流媒体视频文件转H.264具体实现方法
现在有越来越多的人在使用C#语言做编程,但我发现好像用C#做音视频流媒体开发的比较少.我们的libEasyScreenLive目前支持Windows,Android平台,通过EasyScreenLiv ...
- python爬去网页数据并对比excel中数据是否一致_python入门之对比两份excel表格数据...
今天老大交给我一个任务,对比两个版本的excel数据的异同(增删情况),唉,说多了都是泪,自从学会了python,再也不用担心老大这样的任务了~~~ 好了直接上代码吧,代码中解释 import xlr ...
- mysql 删除数据后myd_Windows下的MySQL删除data文件夹后……
MySQL删除data文件夹后,怎么都无法启动了,出现错误: 150106 9:28:43 [Note] Plugin 'FEDERATED' is disabled. wampmysqld: Tab ...
- mysql无法打开excel_关于Navicat将Excel数据导入到MySQL中出现无法打开文件错误
一.起因:关于Navicat将Excel中的数据导入到数据库中,出现无法打开文件问题 最近想通过navicat ,将excel文件(xlsx格式)导入到数据库中,按照导入向导一步步操作,出现无法打开文 ...
- java excel 中文乱码_java中读取excel文件中字符串乱码问题解决方法
以前的时候发现直接java读取一个excel文件输出里面的字符串会乱码,中文字符不会乱码,但是遇到英文的时候输出会乱码.这个问题太奇怪了. 我的表格名字为Shirley.xls. 我曾经直接读取exc ...
- gdal在java环境中读取mif/mid文件以及写入数据
目录 1.maven项目搭建的gdal环境 2.maven项目搭建后开始代码 3.怎么提取两个Layer中某个字段相同的所有数据(这个并非是取属性交集)? 1.maven项目搭建的gdal环境 引入g ...
最新文章
- Oracle控制文件的重建
- 河南省计算机大学应用水平考试,河南省大学计算机等级考试选择题(文管二级)...
- 基于 abp vNext 和 .NET Core 开发博客项目 - 数据访问和代码优先
- Linux系统7z文件解压
- mysql 语句检查_mysql查询语句
- 多个redistemplate_Spring boot 使用多个RedisTemplate
- vs 2005 多語言
- 疯狂的程序员 21-30
- 获取 Adobe Creative Cloud 2023 创意应用软件,解锁无限创造力
- CGLIB动态代理使用介绍
- Keil安装(带安装软件)
- 企业微信的一周小结是怎么统计的?
- 基于视觉的移动平台运动目标检测
- 积分上限函数的导数例题 笔记
- 抖音超火的动态图如何做 怎么制作GIF
- 手机端富文本编辑器_在手机上也能高效写作,这款好用的移动端编辑器值得你尝试...
- ios底部栏设计规范_设计干货:底部导航栏规范设计总结
- 明德文理学院的计算机,今日迎来全球计算机强校CMU卡耐基梅隆,多少中国学生获得青睐?...
- 读书笔记—YES!产品经理(上册)
- 大型智慧灌区信息化管理系统云平台 智慧灌区信息化管理系统解决方案
热门文章
- ListBox滚动条置底
- 学习笔记CB009:人工神经网络模型、手写数字识别、多层卷积网络、词向量、word2vec...
- sqlmap 常用操作
- SQLite第三课 源码编译错误以及解决
- 分布式团队面临的五大问题及解决办法
- JVM内存回收算法简述
- 浅谈Android五大布局——LinearLayout、FrameLayout和AbsoulteLa
- gtkorphan清理孤立软件包
- FVF的D3DFVF_XYZ和D3DFVF_XYZRHW的区别
- 在ubuntu16.0403X64上安装海思交叉编译工具链