Vlookup từ Excel sang note pad

Liên hệ QC

newex

Thành viên chính thức
Tham gia
29/7/15
Bài viết
88
Được thích
8
em có 1 file excel khoảng 1tr dòng cần vlookup lấy dữ liệu từ file notepad 25tr dòng.
các pro có cách nào xử lý giúp e với. dữ liệu quá nặng copy vào excel cũng ko chạy dc
 
VBA em không biết làm bác giúp em dc không ạ. dữ liệu của em đơn giản lắm file note pad có 1 cột file excel có 1 cột chỉ là dữ liệu quá lớn
Gởi file note pad với 25 tr dòng xem máy mình mở lên nổi không
Bài đã được tự động gộp:

em gửi file bác xử lý giúp ạ. cảm ơn bác nhiều.
Kết quả sau khi xử lý file excel là gì
 
Lần chỉnh sửa cuối:
Gởi file note pad với 25 tr dòng xem máy mình mở lên nổi không
Tôi đoánn tr có nghĩa là triệu, thay vì trăm.
Không có cách nào Match/Lookup/Vlookup nổi vài triệu dòng đâu.
Nếu chỉ dò vài lượt thì code có thể dò từ a đến z.
Nhưng nếu dò (theo đầu bài) cả triệu lượt thì cách rừng nhất là đẩy cái file text vào một cách sort nào đó (quick sort?) rồi dùng cách dò nhị phân. Chỉ tôi không biết là có đủ bộ nhớ để chứa mảng hàng chục triệu hay không. Nếu khong đủ thì phải rừng thêm mọt bậc nữa là đọc từng triệu dòng, mỗi phần là một mảng.
Cách khá hơn chút là dùng Dictionary - chỉ tôi không chắc là Dictionary có hữu hiệu với độ lớn này không. Dictionary không dùng bộ nhớ liên tục cho nên có nhiều khả năng tránh được tràn. Tuy nhiên, cỡ hàng triệu dữ liệu thì hash collisions xảy ra khá nhiều. Có thể phải mất nửa tiếng để lập cái dic.
Cách ngon nhất có lẽ là cách khó nhất là lập cây nhị phân để chứa dữ liệu. Cách này đòi hỏi trình độ lập trình rất cao. (chính Dictionary cũng dùng cây nhị phân để chứa index)

Tôi không nghĩ ADO chịu nổi. Với có lớn này muốnn import vào Access cũng khó, nói gì Excel.
 
Tôi đoánn tr có nghĩa là triệu, thay vì trăm.
Không có cách nào Match/Lookup/Vlookup nổi vài triệu dòng đâu.
Nếu chỉ dò vài lượt thì code có thể dò từ a đến z.
Nhưng nếu dò (theo đầu bài) cả triệu lượt thì cách rừng nhất là đẩy cái file text vào một cách sort nào đó (quick sort?) rồi dùng cách dò nhị phân. Chỉ tôi không biết là có đủ bộ nhớ để chứa mảng hàng chục triệu hay không. Nếu khong đủ thì phải rừng thêm mọt bậc nữa là đọc từng triệu dòng, mỗi phần là một mảng.
Cách khá hơn chút là dùng Dictionary - chỉ tôi không chắc là Dictionary có hữu hiệu với độ lớn này không. Dictionary không dùng bộ nhớ liên tục cho nên có nhiều khả năng tránh được tràn. Tuy nhiên, cỡ hàng triệu dữ liệu thì hash collisions xảy ra khá nhiều. Có thể phải mất nửa tiếng để lập cái dic.
Cách ngon nhất có lẽ là cách khó nhất là lập cây nhị phân để chứa dữ liệu. Cách này đòi hỏi trình độ lập trình rất cao. (chính Dictionary cũng dùng cây nhị phân để chứa index)

Tôi không nghĩ ADO chịu nổi. Với có lớn này muốnn import vào Access cũng khó, nói gì Excel.
bác có cách nào khả quan giúp em với.
 
Bạn úp file text lên Google Drive rồi úp link qua đây nhé.
Nếu dữ liệu bí mật bí đường thì chắc liên hệ ai đó làm việc riêng.
em đang làm ở cty không cho vào drive ạ. dư liệu thì ko có gì bí mật ạ
Bài đã được tự động gộp:

Quy ước đầu số của bạn là như thế nào?
kết quả trả về tại cột B file excel nếu có xuất hiện tại file notepad thì đánh dấu là 1 không có thì bỏ trống ạ
 

File đính kèm

  • excel.xlsx
    10.9 KB · Đọc: 6
dạ lọc ra số điện thoại trong file excel có trong file note pad ạ
2 file để cùng thư mục
Chỉnh tên file Text theo tên thực tế
Chạy code xem có bị lổi bộ nhớ không
Code chạy rất lâu
Mã:
Sub XYZ()
  Dim Dic As Object, FSo As Object, TxtFile As Object
  Dim nameText As String, iKey As String
  Dim sArr(), Res(), sRow&, i&, k&
 
  Set Dic = CreateObject("scripting.dictionary")
  With Sheets("Sheet1")
    sArr = .Range("A2", .Range("A" & Rows.Count).End(xlUp)).Value2
  End With
  sRow = UBound(sArr)
  ReDim Res(1 To sRow, 1 To 1)
  For i = 1 To sRow
    Dic.Item(CStr(sArr(i, 1))) = ""
  Next i
  Erase sArr
  Set FSo = CreateObject("Scripting.FileSystemObject")
  nameText = ThisWorkbook.Path & "\notepad.txt"
  Set TxtFile = FSo.OpenTextFile(nameText)
  Do While Not TxtFile.AtEndOfLine
    iKey = TxtFile.ReadLine
    If Dic.exists(iKey) Then
      k = k + 1
      Res(k, 1) = iKey
      Dic.Remove (iKey)
    End If
  Loop
  TxtFile.Close
  Set FSo = Nothing: Set Dic = Nothing
  Sheets("Sheet1").Range("C2").Resize(k) = Res
End Sub
 
Nếu chỉ toàn số thì mọi việc dễ hơn nhiều.
Dựng một mảng Boolean, 100 triệu phần tử.
Đọc file text, cứ thấy số nào thì dùng số ấy làm chỉ sô, vào mảng gài trị True.
Đọc file Excel, cái nào trong mảng True là có.
Hết.

Chú:
1. trong file có số mang dấu phẩy, cần bỏ tất cả các ký tự không phải là số trước khi vào mảng.
2. 100 triệu Integers (hình như Boolean dùng Byte) thì mảng cỡ 800 MB (0,8 GB). Chắc bộ nhớ chịu nổi. (nếu không thì tách làm 10 mảng)
3. nếu tràn bộ nhớ thì có thể dùng kỹ thuật bit map. Giảm được xuống còn 1/8. Tuy nhiên, phải viết thêm 2 hàm setBit, và getBit.
 
Nếu chỉ toàn số thì mọi việc dễ hơn nhiều.
Dựng một mảng Boolean, 100 triệu phần tử.
Đọc file text, cứ thấy số nào thì dùng số ấy làm chỉ sô, vào mảng gài trị True.
Đọc file Excel, cái nào trong mảng True là có.
Hết.

Chú:
1. trong file có số mang dấu phẩy, cần bỏ tất cả các ký tự không phải là số trước khi vào mảng.
2. 100 triệu Integers (hình như Boolean dùng Byte) thì mảng cỡ 800 MB (0,8 GB). Chắc bộ nhớ chịu nổi. (nếu không thì tách làm 10 mảng)
3. nếu tràn bộ nhớ thì có thể dùng kỹ thuật bit map. Giảm được xuống còn 1/8. Tuy nhiên, phải viết thêm 2 hàm setBit, và getBit.
bác làm giúp em vào file mẫu dc ko ạ.
Bài đã được tự động gộp:

2 file để cùng thư mục
Chỉnh tên file Text theo tên thực tế
Chạy code xem có bị lổi bộ nhớ không
Code chạy rất lâu
Mã:
Sub XYZ()
  Dim Dic As Object, FSo As Object, TxtFile As Object
  Dim nameText As String, iKey As String
  Dim sArr(), Res(), sRow&, i&, k&

  Set Dic = CreateObject("scripting.dictionary")
  With Sheets("Sheet1")
    sArr = .Range("A2", .Range("A" & Rows.Count).End(xlUp)).Value2
  End With
  sRow = UBound(sArr)
  ReDim Res(1 To sRow, 1 To 1)
  For i = 1 To sRow
    Dic.Item(CStr(sArr(i, 1))) = ""
  Next i
  Erase sArr
  Set FSo = CreateObject("Scripting.FileSystemObject")
  nameText = ThisWorkbook.Path & "\notepad.txt"
  Set TxtFile = FSo.OpenTextFile(nameText)
  Do While Not TxtFile.AtEndOfLine
    iKey = TxtFile.ReadLine
    If Dic.exists(iKey) Then
      k = k + 1
      Res(k, 1) = iKey
      Dic.Remove (iKey)
    End If
  Loop
  TxtFile.Close
  Set FSo = Nothing: Set Dic = Nothing
  Sheets("Sheet1").Range("C2").Resize(k) = Res
End Sub
khoảng bao lâu thì nó chạy xong bác nhỉ? e chạy từ lúc bác up bài đến giờ chưa thấy ra kết quả
 
em có 1 file excel khoảng 1tr dòng cần vlookup lấy dữ liệu từ file notepad 25tr dòng.
các pro có cách nào xử lý giúp e với. dữ liệu quá nặng copy vào excel cũng ko chạy dc
Đẩy file excel 1tr dòng và file text 25tr đó vào data model ,tạo relationship rồi reload thôi bạn. Nếu có edit thì đưa qua power query edit rồi add vào data model, vài chục triệu dòng không thành vấn đề nếu máy bạn đủ mạnh . Dữ liệu hàng trăm ngàn hay triệu dùng excel hay VBA là không khả thi.
 
Đẩy file excel 1tr dòng và file text 25tr đó vào data model ,tạo relationship rồi reload thôi bạn. Nếu có edit thì đưa qua power query edit rồi add vào data model, vài chục triệu dòng không thành vấn đề nếu máy bạn đủ mạnh . Dữ liệu hàng trăm ngàn hay triệu dùng excel hay VBA là không khả thi.
cái bác nói nó là phần mềm gì vậy có thể hướng dẫn cho e cụ thể hơn dc ko
 
cái bác nói nó là phần mềm gì vậy có thể hướng dẫn cho e cụ thể hơn dc ko
Nó có sẵn trong excel bạn ạ, power pivot bạn add thêm vào, bạn lên google hay youtube học cách hướng dẫn sử dung ( power query, power pivot, data model) tốt hơn nữa thì kiếm cái power Bi .
1591770826486.png
File excel chứa 2 tables 30 tr dòng lấy từ server để tạo report báo cáo 2 năm
1591770929050.png
Máy bạn mạnh thì load rất là nhanh, xử lý như excel bình thường
 
Web KT
Back
Top Bottom