VBA를 통해 CSV 파일 열기(성능)
분명히 이 질문은 여러 번 던져진 것입니다.일반적인 절차:
Workbooks.Open (ActiveWorkbook.Path & "\Test.csv")
CSV를 올바르게 구문 분석하지 못함(한 셀에 행이 많음)
Lernkurve 덕분에, 나는 그의 기능을 사용하여 그것을 바로 잡을 수 있습니다: 세미콜론으로 구분된 CSV 파일 열기
Sub ImportCSVFile(filepath As String)
Dim line As String
Dim arrayOfElements
Dim linenumber As Integer
Dim elementnumber As Integer
Dim element As Variant
linenumber = 0
elementnumber = 0
Open filepath For Input As #1 ' Open file for input
Do While Not EOF(1) ' Loop until end of file
linenumber = linenumber + 1
Line Input #1, line
arrayOfElements = Split(line, ";")
elementnumber = 0
For Each element In arrayOfElements
elementnumber = elementnumber + 1
Cells(linenumber, elementnumber).Value = element
Next
Loop
Close #1 ' Close file.
End Sub
그러나 속도가 빠르지 않습니다(수천 개의 열을 가진 파일이 있습니다).
올바른 구문 분석으로 엑셀에서 CSV 파일을 열 수 있는 기본 방법이 있습니까?
Workbooks.Open
효과도 있습니다.
Workbooks.Open ActiveWorkbook.Path & "\Temp.csv", Local:=True
이 작업은 독일에서 엑셀을 사용하고 영어 윈도우 설치를 사용하기 때문에 기본적으로 .csv를 구분하기 위해 ","를 사용하기 때문에 필요합니다.아래의 코드를 사용해도 "," 구분자를 강제합니다.
Workbooks.Open ActiveWorkbook.Path & "\Test.csv", , , 6, , , , , ";"
그리고.Workbooks.Open ActiveWorkbook.Path & "\Temp.csv", , , 4
+variants이 작동하지 않습니다(!)
Local 매개 변수 ?!에 의해 차단되는 경우 구분 기호 매개 변수가 있는 이유는 무엇입니까? 이것은 전혀 의미가 없습니다. 하지만 이제는 작동합니다.
이 기능은 15MB의 CSV 파일을 읽고 약 3초 만에 컨텐츠를 시트에 복사합니다.코드에 많은 시간이 소요되는 것은 전체 콘텐츠를 한 번에 저장하는 대신 셀 단위로 데이터 셀을 복사한다는 사실입니다.
Option Explicit
Public Sub test()
copyDataFromCsvFileToSheet "C:\temp\test.csv", ",", "Sheet1"
End Sub
Private Sub copyDataFromCsvFileToSheet(parFileName As String, parDelimiter As String, parSheetName As String)
Dim data As Variant
data = getDataFromFile(parFileName, parDelimiter)
If Not isArrayEmpty(data) Then
With Sheets(parSheetName)
.Cells.ClearContents
.Cells(1, 1).Resize(UBound(data, 1), UBound(data, 2)) = data
End With
End If
End Sub
Public Function isArrayEmpty(parArray As Variant) As Boolean
'Returns false if not an array or dynamic array that has not been initialised (ReDim) or has been erased (Erase)
If IsArray(parArray) = False Then isArrayEmpty = True
On Error Resume Next
If UBound(parArray) < LBound(parArray) Then isArrayEmpty = True: Exit Function Else: isArrayEmpty = False
End Function
Private Function getDataFromFile(parFileName As String, parDelimiter As String, Optional parExcludeCharacter As String = "") As Variant
'parFileName is supposed to be a delimited file (csv...)
'parDelimiter is the delimiter, "," for example in a comma delimited file
'Returns an empty array if file is empty or can't be opened
'number of columns based on the line with the largest number of columns, not on the first line
'parExcludeCharacter: sometimes csv files have quotes around strings: "XXX" - if parExcludeCharacter = """" then removes the quotes
Dim locLinesList() As Variant
Dim locData As Variant
Dim i As Long
Dim j As Long
Dim locNumRows As Long
Dim locNumCols As Long
Dim fso As Variant
Dim ts As Variant
Const REDIM_STEP = 10000
Set fso = CreateObject("Scripting.FileSystemObject")
On Error GoTo error_open_file
Set ts = fso.OpenTextFile(parFileName)
On Error GoTo unhandled_error
'Counts the number of lines and the largest number of columns
ReDim locLinesList(1 To 1) As Variant
i = 0
Do While Not ts.AtEndOfStream
If i Mod REDIM_STEP = 0 Then
ReDim Preserve locLinesList(1 To UBound(locLinesList, 1) + REDIM_STEP) As Variant
End If
locLinesList(i + 1) = Split(ts.ReadLine, parDelimiter)
j = UBound(locLinesList(i + 1), 1) 'number of columns
If locNumCols < j Then locNumCols = j
i = i + 1
Loop
ts.Close
locNumRows = i
If locNumRows = 0 Then Exit Function 'Empty file
ReDim locData(1 To locNumRows, 1 To locNumCols + 1) As Variant
'Copies the file into an array
If parExcludeCharacter <> "" Then
For i = 1 To locNumRows
For j = 0 To UBound(locLinesList(i), 1)
If Left(locLinesList(i)(j), 1) = parExcludeCharacter Then
If Right(locLinesList(i)(j), 1) = parExcludeCharacter Then
locLinesList(i)(j) = Mid(locLinesList(i)(j), 2, Len(locLinesList(i)(j)) - 2) 'If locTempArray = "", Mid returns ""
Else
locLinesList(i)(j) = Right(locLinesList(i)(j), Len(locLinesList(i)(j)) - 1)
End If
ElseIf Right(locLinesList(i)(j), 1) = parExcludeCharacter Then
locLinesList(i)(j) = Left(locLinesList(i)(j), Len(locLinesList(i)(j)) - 1)
End If
locData(i, j + 1) = locLinesList(i)(j)
Next j
Next i
Else
For i = 1 To locNumRows
For j = 0 To UBound(locLinesList(i), 1)
locData(i, j + 1) = locLinesList(i)(j)
Next j
Next i
End If
getDataFromFile = locData
Exit Function
error_open_file: 'returns empty variant
unhandled_error: 'returns empty variant
End Function
이것은 당신에게 도움이 될 수도 있고, 또한 당신의 방법에 달려있습니다.CSV
파일이 작성됩니다.
- Excel 시트를 열고 메뉴로 이동합니다.
Data
>Import External Data
>Import Data
. - 선택하세요.
CSV
파일. - 원본 데이터 유형: 선택
Fixed width
,그리고나서Next
. - 자동적으로 당신의 모든 영역을 구분합니다.
columns
. 그 다음, 분할된 열을 확인할 수 있습니다.Data preview
판넬을 깔다 - 그리고나서
Finish
& 보다
참고: 사용할 수도 있습니다.Delimited
원본 데이터 유형으로 지정합니다.이 경우 구분 문자를 키 입력해야 합니다.
HTH!
텍스트 가져오기 기능을 사용해보셨습니까?
저도 같은 문제가 있어서 엑셀에서 CSV 파일을 열 수가 없습니다.워크북을 통해 엑셀로 파일을 여는 이 문제에서 저에게 맞는 해결책을 찾았습니다.텍스트 열기
그 질문이 저에게 맞는 코드를 알아내는데 도움이 되었습니다.코드는 다음과 같습니다.
Private Sub OpenCSVFile(filename as String)
Dim datasourceFilename As String
Dim currentPath As String
datasourceFilename = "\" & filename & ".csv"
currentPath = ActiveWorkbook.Path
Workbooks.OpenText Filename:=currentPath & datasourceFilename, _
Origin:=xlWindows, _
StartRow:=1, _
DataType:=xlDelimited, _
TextQualifier:=xlDoubleQuote, _
ConsecutiveDelimiter:=False, _
Tab:=False, _
Semicolon:=False, _
Comma:=True, _
Space:=False, _
Other:=False, _
FieldInfo:=Array(Array(1, 1), Array(2, 1)), _
DecimalSeparator:=".", _
ThousandsSeparator:=",", _
TrailingMinusNumbers:=True
End Sub
적어도 제가 사용할 수 있는 많은 매개 변수에 대해 알 수 있었습니다.Workbooks.OpenText
방법.
때로는 Workbooks.open을 사용하는 모든 솔루션이 매개 변수를 아무리 많이 설정해도 작동하지 않습니다.저에게 가장 빠른 해결책은 지역 & 언어 설정에서 목록 구분자를 변경하는 것이었습니다.영역 창 / 추가 설정.../ 구분자를 나열합니다.
csv가 제대로 열리지 않는 경우 ','를 목록 구분자로 설정했을 수 있습니다.그냥 ';'로 바꾸면 다 해결됩니다."모든 것이 너에게 불리하다"고 할 때 가장 쉬운 방법 :P
로컬 매개 변수를 설정하여 문제를 해결할 뿐입니다.Workbook.Open
방법은 다음과 같습니다.
xtrct_wb = Workbooks.Open(filePath, Local:=True)
그러면 모든 정보가 해당 열에 있습니다.당신에게도 효과가 있기를 바랍니다.
언급URL : https://stackoverflow.com/questions/9564908/open-csv-file-via-vba-performance
'programing' 카테고리의 다른 글
스레드 오류 탐지를 위해 Helgrind 또는 DRD를 사용해야 합니까? (0) | 2023.09.28 |
---|---|
iOS에 파일 쓰기 (0) | 2023.09.28 |
wocommerce 사용자 지정 ajax 탑 카트 (0) | 2023.09.28 |
UNIQUE 제약 조건(필드에 특정 값이 포함된 경우에만 해당) (0) | 2023.09.28 |
워드프레스 + Ajax 페이지 로딩 + Gravity 폼 + Gravity 폼 페이지 브레이크 (0) | 2023.09.28 |