Tại sao cnt = 1, nói cách khác file có rất nhiều dòng nhưng...

Liên hệ QC

khongtu19bk

Thành viên hoạt động
Tham gia
5/12/09
Bài viết
147
Được thích
69
Mình có file như sau
link: https://www.mediafire.com/file/bh769rabnoi2pf0/filesub_VBA.zip/file
Cụ thể đây là file .ass

Code dưới đây dùng để đọc file này
Mã:
Sub Openassfile(ByVal FilePath As String)

  
    Dim cnt As Long
  
    Open FilePath For Input As #1
    cnt = 0
    ReDim arr(1 To 1)
    Do Until EOF(1)
        Line Input #1, LineFromFile
        cnt = cnt + 1
        ReDim Preserve arr(1 To cnt)
        If InStr(1, LineFromFile, "・ソ") = 1 Then LineFromFile = Mid(LineFromFile, 3, Len(LineFromFile) - 2)
        arr(cnt) = LineFromFile
    Loop
    Close #1
End sub
Tại sao kết quả lại ra cnt = 1.
Ai biết giải đáp dùm với ạ.

Khi mở file bằng notepad++ thì hiển thị như này:
217506

Nhưng khi mở bằng notepad thông thường thì hiển thị như này, không hiểu file bị sao nữa.
217507
 
Lần chỉnh sửa cuối:
- cnt = 1 vì nó không chạy được vòng lặp nào cả.
- Line Input #1 nó sẽ đọc từng dòng trong file của bạn nhưng thực chất file này của bạn không có ký hiệu xuống dòng trong đó (vbCrLf hoặc Chr(13) + Chr(10)) nên Line input chỉ đọc 1 lần hết file chứ không có dòng để loop. Nhìn file bạn mở trong Notepad là thấy nó viết luôn tuồn rồi đó.
- Notepad ++ khác NotePad: vì Notepad thuần tuý chỉ là trình soạn thảo file text thông thường, còn Notepad++ đã tích hợp để soạn thảo code cho nhiều ngôn ngữ lập trình (XML, HTML, vba...), nó có các tính năng bắt chính tả khi code, thụt đầu đòng...

Trong file ass của bạn, tôi thấy nó là phụ đề phim và có từ "Dialogue:" để phân biệt các dòng thoại vậy bạn có thể dùng từ này để cắt chuỗi đưa vô mảng (dùng hàm Split) rồi tìm ký tự tiếng Nhật của bạn. Ký tự này tôi gõ trong code VBA không được nhé.
Ví dụ:
Mã:
Sub Openassfile(FilePath As String)

    Dim cnt As Integer, hFile As Integer
    Dim LineFromFile As String
    Dim arr() As String

    hFile = FreeFile
    Open FilePath For Input As #hFile

    Do While (Not (EOF(hFile)))
        Line Input #hFile, LineFromFile
    Loop
    Close #hFile

    Dim s As String
    Dim vItem As Variant
    cnt = 0
    ReDim arr(1 To 1)
    For Each vItem In Split(LineFromFile, "Dialogue:")
        If InStr(1, vItem, "?") > 0 Then s = Mid(vItem, 3, Len(vItem) - 2)
        cnt = cnt + 1
        ReDim Preserve arr(1 To cnt)
        arr(cnt) = s
        Debug.Print arr(cnt)
    Next
   
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Notepad của Windows không liên quan gì tới Notepad++ để mà so sánh cả.
Nhưng cuối cùng không rõ chủ thớt muốn làm gì..
 
Upvote 0
- cnt = 1 vì nó không chạy được vòng lặp nào cả.
- Line Input #1 nó sẽ đọc từng dòng trong file của bạn nhưng thực chất file này của bạn không có ký hiệu xuống dòng trong đó (vbCrLf hoặc Chr(13) + Chr(10)) nên Line input chỉ đọc 1 lần hết file chứ không có dòng để loop. Nhìn file bạn mở trong Notepad là thấy nó viết luôn tuồn rồi đó.
- Notepad ++ khác NotePad: vì Notepad thuần tuý chỉ là trình soạn thảo file text thông thường, còn Notepad++ đã tích hợp để soạn thảo code cho nhiều ngôn ngữ lập trình (XML, HTML, vba...), nó có các tính năng bắt chính tả khi code, thụt đầu đòng...

Trong file ass của bạn, tôi thấy nó là phụ đề phim và có từ "Dialogue:" để phân biệt các dòng thoại vậy bạn có thể dùng từ này để cắt chuỗi đưa vô mảng (dùng hàm Split) rồi tìm ký tự tiếng Nhật của bạn. Ký tự này tôi gõ trong code VBA không được nhé.
Ví dụ:
Mã:
Sub Openassfile(FilePath As String)

    Dim cnt As Integer, hFile As Integer
    Dim LineFromFile As String
    Dim arr() As String

    hFile = FreeFile
    Open FilePath For Input As #hFile

    Do While (Not (EOF(hFile)))
        Line Input #hFile, LineFromFile
    Loop
    Close #hFile

    Dim s As String
    Dim vItem As Variant
    cnt = 0
    ReDim arr(1 To 1)
    For Each vItem In Split(LineFromFile, "Dialogue:")
        If InStr(1, vItem, "?") > 0 Then s = Mid(vItem, 3, Len(vItem) - 2)
        cnt = cnt + 1
        ReDim Preserve arr(1 To cnt)
        arr(cnt) = s
        Debug.Print arr(cnt)
    Next
  
End Sub
Cám ơn bạn.
Có nhiều vấn đề không hiểu như nào vì nhìn bằng mắt thường thì không ra.
Tạm thời mình dùng giải pháp khác là mở bằng excel.
Mã:
Call Workbooks.OpenText(FilePath, Origin:=65001, Tab:=True)
Code sẽ bị chậm đi một chút nhưng không sao. hjc.
 
Upvote 0
File thì tên ass, biến thì tên cnt. Hãi thật.
Chỉ cần thêm cái dic nữa là đủ bộ.
 
Upvote 0
Web KT
Back
Top Bottom