Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 | 2 |

 

  Вопрос: Текст в массив или в Excel Добавлено: 03.03.10 09:37  

Автор вопроса:  Michael Melchakov | ICQ: 302272185 
Подскажите как сделать следующее:
Есть текстовый файл, с содержимым примерно такого плана (количество строк - очень много):
-26,34674644
-25,51070404
-24,77244759
-24,03800392
-23,29808235
-22,64535332
-21,92366028
-21,23150635
-20,61622238
-19,97153473
-19,3574276

Этот текст, необходимо закинуть в массив Visual Basic.NET или в столбец (например "А") Excel-а. Само собой в числовом варианте.

Примеров вроде как и нашел не мало, но все не получается. Подскажите пожалуйста, очень надо :'(

Ответить

  Ответы Всего ответов: 16  

Номер ответа: 1
Автор ответа:
 Ishayahu



ICQ: 329944992 

Вопросов: 4
Ответов: 21
 Web-сайт: ishayahu.blogspot.com
 Профиль | | #1
Добавлено: 03.03.10 09:49
так все просто
считаешь кол-во строк
переопределяешь массив на нужный размер
считываешь построчно в массив

Ответить

Номер ответа: 2
Автор ответа:
 Ishayahu



ICQ: 329944992 

Вопросов: 4
Ответов: 21
 Web-сайт: ishayahu.blogspot.com
 Профиль | | #2
Добавлено: 03.03.10 09:55
пришли пример своего кода, может я пойму, в чем ошибка

Ответить

Номер ответа: 3
Автор ответа:
 UnDeAdZak



Вопросов: 80
Ответов: 476
 Профиль | | #3 Добавлено: 03.03.10 10:10
  1.  
  2.         Dim SR As New System.IO.StreamReader("ADRESS_FILE")
  3.         Dim b As Boolean = False
  4.         Dim mass(0 To 100) As String
  5.         Dim i As Integer = 0
  6.         Do While (b = False)
  7.             If SR.EndOfStream = True Then 'если конец файла, то
  8.                 b = True
  9.             Else 'иначе считываеш в массив
  10.                 mass(i) = SR.ReadLine
  11.                 i += 1
  12.             End If
  13.         Loop

Ответить

Номер ответа: 4
Автор ответа:
 UnDeAdZak



Вопросов: 80
Ответов: 476
 Профиль | | #4 Добавлено: 03.03.10 10:11
тока яс Do while не уверен что правильно написал, может быть там b надо на trye поставить

Ответить

Номер ответа: 5
Автор ответа:
 Michael Melchakov



ICQ: 302272185 

Вопросов: 12
Ответов: 31
 Профиль | | #5 Добавлено: 03.03.10 10:36
Сейчас нахожусь на следующей стадии:
  1.  
  2. Imports System
  3. Imports System.IO
  4. Imports System.Text
  5.  
  6. ' извиняюсь, тут разделители на поставил, но это событие дальше после нажатия кнопки (допустим)
  7. ' Текстовый файл считывается построчно в массив lineArray()
  8.         Dim lineArray() As String = System.IO.File.ReadAllLines("C:\put.txt", System.Text.Encoding.GetEncoding(1251))



Дальше, думаю сделать таким образом: каждое значение массива перевести в число - таким образом Val(Replace(lineArray(X), ",", ".";))

Уперся, опять на определении размерности массива (или на количестве строк текстового файла - количество строк - лучше). :)


Ответить

Номер ответа: 6
Автор ответа:
 Michael Melchakov



ICQ: 302272185 

Вопросов: 12
Ответов: 31
 Профиль | | #6 Добавлено: 03.03.10 10:38
ответ от UnDeAdZak - чуть погодя попробую :) все равно спасибо :)

Ответить

Номер ответа: 7
Автор ответа:
 Ishayahu



ICQ: 329944992 

Вопросов: 4
Ответов: 21
 Web-сайт: ishayahu.blogspot.com
 Профиль | | #7
Добавлено: 03.03.10 10:42
зачем так? можно же проще:
Dim SR As New System.IO.StreamReader("ADRESS_FILE";)
' файл надо еще вроде открыть?
        Dim b As Boolean = False
        Dim mass() As String
        Dim i As Integer = 0
        Do Until SR.EndOfStream
                i += 1
        Loop
ReDim mass(i)
' сюда надо вставить переход на начало файла.  например закрыть его  и открыть еще раз. не помню точно как делать
Do Until SR.EndOfStream
                mass(i) = SR.ReadLine

        Loop

Ответить

Номер ответа: 8
Автор ответа:
 Fatty



Вопросов: 0
Ответов: 55
 Профиль | | #8 Добавлено: 03.03.10 12:27
Спробуй так проверил на Excel 2003(рус)/ 2007(eng)


Imports System.IO
Imports System.Runtime.InteropServices
Imports System.Globalization
Imports System.Threading
Imports Microsoft.Office.Interop.Excel
Imports Excel = Microsoft.Office.Interop.Excel
'' Require: References -> COM -> Microsoft.Excel XX.0 Object Library
_____________________________________________________
Public Sub TryIt()
        Dim oldCult = CultureInfo.CurrentCulture()
        '' This line is very important!
        Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("ru-RU";) '<-- change culture on whatever you need
        Dim miss As Object = System.Reflection.Missing.Value
        Dim i As Integer
        Dim textfile As String = "C:\numbers.txt"
        '' Open Excel
        Dim m_objExcel As Excel.Application = New Excel.Application
        m_objExcel.Visible = True
        m_objExcel.UserControl = True
        Dim m_objBooks As Excel.Workbooks = CType(m_objExcel.Workbooks, Excel.Workbooks)
        Dim m_objBook As Excel.Workbook = Nothing
        Try
            '' Open workbook
            m_objBooks.Open("C:\numbers.xls", False, False, miss, "", False, miss, Excel.XlPlatform.xlWindows, miss, True, miss, miss, miss, False)
            m_objBook = m_objExcel.ActiveWorkbook
            m_objBook.Activate() 'optional
            Dim m_objSheets As Sheets = m_objBook.Sheets
            Dim m_objSheet As Worksheet = m_objSheets.Item(1) '<--"Лист1"
            'm_objSheet.Cells.ClearContents() 'optional may to remove this line
            Dim m_objCells As Range = m_objSheet.Cells

            If IO.File.Exists(textfile) Then
                'Create a StreamReader and open our text file
                Using pars As New StreamReader(textfile)
                    i = 1
                    'Now add our columns (we will check to make sure the column doesnt exist before adding it)
                    While Not pars.EndOfStream
                        Dim line As String = pars.ReadLine
                        '' write data starting from cell "A1"
                        Dim m_objRange As Range = Nothing
                        m_objRange = m_objSheet.Range(m_objCells(i, 1), m_objCells(i, 1))
                        m_objRange.NumberFormat = "@"
                        m_objRange.Value2 = line
                        i += 1
                    End While
                End Using

            End If
            '' Save the file in the typical workbook format
            m_objBook.SaveAs("C:\numbers.xls", Excel.XlFileFormat.xlWorkbookNormal, "", "", False, False, XlSaveAsAccessMode.xlNoChange, miss, miss, miss, miss, miss)

        Catch ex As System.Exception
            MessageBox.Show(ex.StackTrace)
        Finally
            '' close workbook and quit Excel
            If Not m_objBook Is Nothing Then
                m_objBook.Close(False, miss, miss)
                m_objBook = Nothing
            End If
            m_objExcel.Quit()
            '' release process if it's still active
            System.Runtime.InteropServices.Marshal.FinalReleaseComObject(m_objExcel)
            Thread.CurrentThread.CurrentCulture = oldCult
        End Try
    End Sub


~'J'~

Ответить

Номер ответа: 9
Автор ответа:
 UnDeAdZak



Вопросов: 80
Ответов: 476
 Профиль | | #9 Добавлено: 03.03.10 12:45
Ishayahu у меня правелнее, ты сначала вычесляеш количество строк, после череходиш в начало файла и считываеш все строки, а я считываю строку ,и сразу-же проверяю кончился файл или нет.Хотя,в твоём варианте учитывается количество элементов массива(

Ответить

Номер ответа: 10
Автор ответа:
 Michael Melchakov



ICQ: 302272185 

Вопросов: 12
Ответов: 31
 Профиль | | #10 Добавлено: 03.03.10 15:45
Спасибо всем за подсказки, решение нашел следующим образом:

  1.  
  2. Imports System
  3. Imports System.IO
  4. Imports System.Text
  5.  
  6.  
  7.  Public zu, i As Double ' объявление промежуточных переменных
  8.  
  9.  
  10. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  11.  
  12. 'чтение всех строк в массив
  13.             Dim lineArray() As String = System.IO.File.ReadAllLines("C:\put.txt", System.Text.Encoding.GetEncoding(1251))
  14.  
  15. ' переменная zu - определяет размер массива
  16.         zu = UBound(lineArray)
  17.  
  18. ' объявляю другой массив - для числовых значений (хотя можно и не делать, но так показалось проще :) )
  19.         Dim mass(zu) As Double
  20.  
  21. ' переводи массив, букв в числа (количество строк 57624 - работает моментально)
  22.         For i = 1 To zu
  23.             mass(i) = Val(Replace(lineArray(i), ",", "."))
  24.         Next
  25.  
  26. End Sub
  27. End Class
  28.  
  29.  



Если кому надо, то могу просто написать как это закинуть в эксель? :)

Ответить

Номер ответа: 11
Автор ответа:
 Ishayahu



ICQ: 329944992 

Вопросов: 4
Ответов: 21
 Web-сайт: ishayahu.blogspot.com
 Профиль | | #11
Добавлено: 03.03.10 17:02
Хотя,в твоём варианте учитывается количество элементов массива(

вот-вот. условия то задачи были "очень большой файл". да и вообще лучше писать как можно более универсальные проги

Ответить

Номер ответа: 12
Автор ответа:
 Ishayahu



ICQ: 329944992 

Вопросов: 4
Ответов: 21
 Web-сайт: ishayahu.blogspot.com
 Профиль | | #12
Добавлено: 03.03.10 17:03
Если кому надо, то могу просто написать как это закинуть в эксель? :)

давай

Ответить

Номер ответа: 13
Автор ответа:
 Michael Melchakov



ICQ: 302272185 

Вопросов: 12
Ответов: 31
 Профиль | | #13 Добавлено: 03.03.10 20:02
Добавление в эксель:

  1.  
  2.             Dim oExcel As Object
  3.             Dim oBook As Object
  4.             Dim oSheet As Object
  5.  
  6.             'Открыть новую книгу Excel
  7.             oExcel = CreateObject("Excel.Application")
  8.             oBook = oExcel.Workbooks.Open("C:\book.xls") ' название книги - закидываю в сущестующую (хотя можно и создать новую)
  9.             oSheet = oBook.Worksheets(1) ' 1-й лист
  10.  
  11.              oSheet.Range("A2").Resize(zu, 1).Value = DataArray ' передать данные массива DataArray в столбец "А" начиная с ячейки A2. Минус данного способа (хотя может я недокумекал) -  чистит предидущий столбец.



Здесь zu - количество строк. DataArray - массив (почему то пришлось делать) минимум двумерный.

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

Ответить

Номер ответа: 14
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #14 Добавлено: 04.03.10 05:01
1) Если у тебя разделитель целой и дробной части символ ",", то не нужно делать замену на точку, достаточно при приведении к типу Double указать русскую локаль.
  1. Dim RU As New CultureInfo("ru-ru")
  2. Dim Value As Double = Decimal.Parse("123,5", RU)


2) Если файл большой, читать лучше всего в потоковом режиме через StreamReader, как было показано выше
3) Для хранения данных использовать не массив, а List в нем не нужно заранее указывать кол-во данных, можно добавлять по необходимости сколько нужно.

Ответить

Номер ответа: 15
Автор ответа:
 Michael Melchakov



ICQ: 302272185 

Вопросов: 12
Ответов: 31
 Профиль | | #15 Добавлено: 04.03.10 09:44
Насчет первого и второго пункта спасибо (хотя второй пункт у меня размер файла - относительно большой - около метра - пока работает в милисекунды).

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

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам