2013-04-18 38 views
0

我被要求复制由以下Excel VBA代码发送的文件。问题在于导出“for”循环中包含的数据。数量“.111”正在写入导出文件中,为“øSã=”,“.222”正在写为“øSc>”,而“.333”正在写为“ú〜ª>”。文件导出 - 奇怪的字符

我不完全确定这里发生了什么。但是,我发送数据的目标遗留系统的任何速率都能够正确读取这些数据(即将其转换回原始值)。

有没有人有任何想法是怎么回事,以及如何复制这种行为,以便我的文件可以被读取?

Type Rigo_File 
Status As Integer 
Invio As Integer 
Codice As String * 13 
Quantita As Single 
Udm As Integer End Type 

Type type_file 
Partita As String * 10 
Macchina As String * 25 
articolo As String * 25 
colore As String * 25 
note As String * 25 
urgenza As Integer 
Invio As String * 3 
Righi(20) As Rigo_File 
End Type 

Dim NrOpen As Integer 
Dim NomeFile As String, NomeFileTmp As String 
Dim Rigo_File 
Dim type_file 
Dim typeM As type_file 
Dim c As Integer 

Sub CREATEFILE() 
FILEDIR = "C:\" 
FILENAMEE = "TESTFILE1.txt" 

Partita = Right(Cells(1, 3), 10) 
Macchina = Left(Cells(2, 3), 25) 
articolo = Left(Cells(3, 3), 25) 
colore = Left(Cells(4, 3), 25) 
note = Left(Cells(5, 3), 25) 
urgenza = CDbl(Cells(6, 3)) 

With typeM 
.Partita = Partita 
.Macchina = Macchina 
.articolo = articolo 
.colore = colore 
.note = note 
.urgenza = urgenza 
.Invio = "001" 
For ci = 1 To 20 
.Righi(ci).Status = True 
.Righi(ci).Invio = 1 
.Righi(ci).Codice = Cells(8 + ci, 2) 
.Righi(ci).Quantita = Cells(8 + ci, 3) 
.Righi(ci).Udm = 1 
Next ci 
End With 

NrOpen = FreeFile 
On Error GoTo 0 

Open FILEDIR & FILENAMEE For Random Access Write Shared As #NrOpen Len = Len(typeM) 

Put #NrOpen, 1, typeM 
Close #NrOpen 

结束子

+0

如果数据正在被正确读取,那就不用担心了,但我会在内存中查看数字的表示形式:http://stackoverflow.com/questions/13663026/how-to-represent-floating -point-in-binary-ieee – SeanC

回答

1

创建文件的一些狩猎围绕我发现以下后的文件:

Dim bArray As Byte() 
    Dim val As Single = 0.111 
    Dim sChars as String 
    Dim arrChars as String() 
    Dim sFinal as string 

    bArray = BitConverter.GetBytes(val) 
    sChars = BitConverter.ToString(bArray) 
    arrChars = Split(sChars, "-") 
    For Each sChar as string in arrChars 
     sFinal & = ChrW(Convert.ToInt32(sChar, 16)) 
    Next 

这与Put#方法和BinaryWriter.Write方法执行的转换类型相同,不需要写入文件。

1

Put #在一种二进制格式的写入数据 - 长度为字节前述字段,数字转换为二进制及其他有用的东西。只要您使用Get #再次读取数据,这就没有问题了。尽管你的文件不是人类可读的。

如果要编写纯文本ASCII数据,请改为使用Print #Write #,并观察这两个(分隔符,终止CR + LF等)之间的差别差异。

您可能还需要分别在Print #Write #声明中指定TypeM的每个元素 - 我不确定这两个接受用户定义的对象。

但要注意:你的目标系统,这是正常读取由Put #创建可以拒绝通过Print #Write #

+0

我的问题是如何使用T-SQL复制这种二进制格式,因为这是遗留系统所能理解的。我试图找到一些关于转换性质的文档。 –

+0

ahhh ...这是一个不同的问题......以及我的第一个反应是要求Excel使用'Input#1'从数据库中获得的纯文本文件中读取并使用'Put#2'将其输出到另一个文件中 – MikeD

+0

理想情况下,能够以Put#(或更新的'BinaryWriter')将单个文件写入文件的方式在T-SQL中进行复制将会很好。 –