Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
2 / 2 / 0
Регистрация: 26.03.2012
Сообщений: 33
1

Проблемы с чтением и записью в файл в Юникоде

31.03.2012, 13:49. Просмотров 1497. Ответов 5
Метки нет (Все метки)


Добрый день. Есть код:
Запись в файл:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Option Explicit
 Sub SavingCaseAsUnicodeFile()
 Dim FileName, SheetName As String, SupportingSheet As String, Buffer As String
 Dim column As Integer, i As Integer
 'preferences
 FileName = Application.GetSaveAsFilename( _
 fileFilter:="Text Files (*.case), *.case")
 SheetName = "Лист1"
 SupportingSheet = "Лист2"
 column = 2
 If FileName <> False Then
 i = 1
 For i = 1 To 400
 Buffer = ThisWorkbook.Sheets(SheetName).Cell s(i, column).Value
 ThisWorkbook.Sheets(SupportingSheet ).Cells(i, 1).Value = Buffer
 Next i
 
 Sheets(SupportingSheet).Copy
 ActiveWorkbook.SaveAs FileName, xlUnicodeText
 ActiveWorkbook.Close False
 Sheets(SheetName).Select
 Else
 End If
 End Sub
Чтение из файла:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Option Explicit
 Function GetFilePath(Optional ByVal Title As String = "Choose File for work", _
 Optional ByVal InitialPath As String = "c:\", _
 Optional ByVal FilterDescription As String = "Case", _
 Optional ByVal FilterExtention As String = "*.*")
 Dim ps As String
 On Error Resume Next
 With Application.FileDialog(msoFileDialo gOpen)
 .ButtonName = "Choose": .Title = Title: .InitialFileName = InitialPath
 .Filters.Clear: .Filters.Add FilterDescription, FilterExtention
 If .Show <> -1 Then Exit Function
 GetFilePath = .SelectedItems(1): ps = Application.PathSeparator
 End With
 End Function
 Sub ImportCase()
 Dim Simv As String * 2, FileName As String, SheetName As String, s As String
 Dim i As Integer
 
 FileName = GetFilePath("Choose case for import", , "Case", "*.case")
 SheetName = "Ëèñò1"
 
 If FileName = "" Then Exit Sub ' exit in the case of refuse
 Open FileName For Random As #1 Len = 2
 i = 1
 Do While Not EOF(1)
 Get #1, , Simv
 s = StrConv(Simv, vbFromUnicode)
 If s = Chr(13) Then
 i = i + 1
 Get #1, , Simv
 Sheets(SheetName).Cells(i, 1) = ""
 Else
 Sheets(SheetName).Cells(i, 1) = Cells(i, 1) + s
 End If
 Loop
 Close #1
 End Sub
Причем как оказалось с обеими частями есть проблемы.
1)При сохранении в файл есть нежелательный промежуточный шаг записи нужного столбца на чистый лист, так как даннай код сохраняет только лист целиком.
2)Чтение оказывается выдает самые разные ошибки, иногда проглатывает кавычки, иногда раздваивает последнюю букву, иногда вместо 111111 или 222 возвращает 6(На снимке первый столбец - загружен из файла, второй исходный).Хотя если текст состоит из одних лишь букав без знаков, проблем никаких .
Выложил обе части потому как что то мне подсказывает если чуток изменить код записи, код чтения не будет работать всовсем.

Очень прошу помогите решить данные проблемы.
0
Миниатюры
Проблемы с чтением и записью в файл в Юникоде  
Вложения
Тип файла: xls 1.xls (58.0 Кб, 8 просмотров)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.03.2012, 13:49
Ответы с готовыми решениями:

Проблемы с чтением и записью двух однонаправленных сокетов
Добрый день, прошу подсказать как решить проблемы с чтением и записью в сокет. У меня есть два...

Не могу разобраться чтением и записью в файл
Тема моей курсовой работы &quot;разработка программы определения размера стихотворения&quot;. В краце мне...

Нужно написать программу с чтением/записью в файл (потоки)
Помогите пожалуйста, в изучении Java я новичок, задали задание (изучаем потоки) следующего...

STM32: FatFS & USB Host & Flash - проблемы с чтением/записью
Уважаемые гуру! Ломаю голову, но найти разумное объяснение симптомам не могу. Есть...

__________________
Помогаю в написании студенческих работ здесь.
5
Казанский
31.03.2012, 22:21
  #2

Не по теме:

Кому интересно - тема развивается на другом форуме

0
Почетный модератор
21281 / 9015 / 1081
Регистрация: 11.04.2010
Сообщений: 11,015
31.03.2012, 23:14 3
Казанский, пусть развивается, это не попадает под запрет. Лишь бы на этом форуме темы не дублировались
0
3201 / 952 / 221
Регистрация: 29.05.2010
Сообщений: 2,069
01.04.2012, 00:04 4
Возникшие проблемы:
1. использование символа chr(34) в строке символов.
2. при сохранении в таком формате кавычки записываются как """, при импорте они и восстанавливаются
3. по поводу 222 превращающегося в 6 изменить код в импорте:

Visual Basic
1
2
3
4
5
6
7
8
9
10
    Do While Not EOF(1)
        Get #1, , Simv
        s = s & StrConv(Simv, vbFromUnicode)
        If Right(s, 1) = Chr(13) Then
            Sheets(SheetName).Cells(i, 1) = s
            i = i + 1
            s = ""
            Get #1, , Simv
        End If
    Loop
1
11193 / 3566 / 632
Регистрация: 13.02.2009
Сообщений: 10,658
01.04.2012, 00:55 5
Я бы посоветовал для начала озвучить задачу полностью.
А то смотрю и не понимаю: зачем всё это:

Visual Basic
1
2
3
4
For i = 1 To 400
 Buffer = ThisWorkbook.Sheets(SheetName).Cell s(i, column).Value
 ThisWorkbook.Sheets(SupportingSheet ).Cells(i, 1).Value = Buffer
 Next i
Зачем гнать через дополнительню переменную? Зачем вообще цикл?

Visual Basic
1
2
  Sub ImportCase
Sheets(SheetName).Cells(i, 1) = Cells(i, 1) + s
Неоднозначная запись. Конкретная ячейка на конкретном листе приравнивается к ячейке активного листа. Это так и должно? Какой лист должен быть активным при запуске процедуры. И второе: при каждом запуске данные дописыватся в ячейку? Или всё-таки записываются?
0
2 / 2 / 0
Регистрация: 26.03.2012
Сообщений: 33
01.04.2012, 12:31  [ТС] 6
По порядку:
1) Да, сейчас заметил. Цикл и переменная это мои глупые ошибочки которые можно убрать и код ничуть не пострадает. Я еще и не такое бывает вытворяю. А копирую столбец на чистый лист, чтоб отделить его от остальной таблицы. Потому что функция которую я использовал записывает в файл лист целиком.
2)С листами у меня тоже путаница вышла. Записываться(не дописываться) данные должны в конкретный лист а не в активный.

Об изначальной задаче:

Нужно сохранить данные из конкретного столбца на конкретном листе в текстовый файл.Столбец изначально состоит из пустых ячеек в перемешку с полными(в них рус и анл текст, знаки, цифры). Затем когда нибудь позже загрузить их обратно в таком же виде в те же места. Как импорт и экспорт в софте

Но есть еще проблема с языками. К примеру запущу програмку на русской машине, столбец сохраню в файл. Затем на английской машине попробую загрузить этот столбец из текстового файла в програмку(Такая ситуация полюбому будет). В таком случае русские буквы превратятся в кракозябры. Для этого нужен Юникод

Вероятно данную задачу можно решить и подругому, сделать код лучше и короче. Но так как у меня пока почти нет опыта общения с VBA, я просто собирал его из того что получилось найти и из чужих советов. И вот что вышло

Добавлено через 8 минут
Кстати поправки сделанные Totai действительно убрали проблему с цифрами, уже за это большое спасибо.

Добавлено через 10 часов 47 минут
Кстати Казанский уже решил данную проблему:
В проблему не вникал, но может так сделать: сформировать строку из ячеек, переложить ее в байтовый массив, сохранить массив в файл (в двоичном виде).
Потом считать файл в байтовый массив, переложить в строку, разбить на ячейки?

Вот, попробуйте. Полученный файл открывается Блокнотом, причем Блокнот распознает его как Unicode файл.
Код:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Sub Save1stColumn()
Dim s$, b() As Byte
s = Join(Application.Transpose(Range("A1", Cells(Rows.Count, 1).End(xlUp)).Value), vbCrLf)
b = s
Open ActiveWorkbook.FullName & ".case" For Binary As #1
Put 1, , b
Reset
End Sub
 
Sub ReadTo2ndColumn()
Dim s$, b() As Byte, v
Open ActiveWorkbook.FullName & ".case" For Binary As #1
ReDim b(1 To LOF(1))
Get 1, , b
Reset
s = b
v = Split(s, vbCrLf)
Range("B1").Resize(UBound(v) + 1) = Application.Transpose(v)
End Sub
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.04.2012, 12:31

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Задачка с записью и чтением из текстового файла с++
В текстовом файле «In.txt» сохраняются через пробел целые числа. Переписать в новый текстовый...

Шифрование. Проблема с чтением и записью файла.
Доброго времени суток. Программа шифрует и расшифровывает файлы с помощью сети Фейстеля. Только...

Шифрование и расшифровка строки с записью/чтением из БД
Доброго времени суток. Необходимо реализовать шифрование строки, и затем ее расшифрование. Данная...

Хранилище данных с быстрым чтением/записью
Добрый день! Подскажите пожалуйста, в чем лучше хранить данные (скажем коллекцию List&lt;T&gt;), чтобы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.