Hàm đọc file2 nếu như file1 không tồn tại và ngược lại trong Power Querry

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

son0611excel

Thành viên chính thức
Tham gia
3/1/20
Bài viết
69
Được thích
11
Giới tính
Nam
Nghề nghiệp
Kỹ Thuật
Em chào các anh ạ, em đang tìm hiểu hàm đọc 1 trong 2 path nếu file còn lại không tồn tại mà gặp vấn đề, code của em chỉ đọc được path1, nếu như em xoá file của path1 đi thì nó báo lỗi mà không đọc path2, code của em bên dưới nhờ các anh xem em sai chỗ nào để chỉnh sửa ạ.

Em muốn nó load 1 trong 2 thôi, ví dụ nếu file1 tồn tại thì nó sẽ load file1, còn file1 bị xoá thì sẽ load file 2, còn cả 2 file tồn tại thì ưu tiên load file 1.

Mã:
let
    Path1 = "W:\01_Mold\Ngày 1.csv",
    Path2 = "W:\01_Mold\Trống.csv",

    // Hàm kiểm tra sự tồn tại của tệp tin
    FileExists = (Path1) => try File.Contents(Path2) <> null otherwise false,

    // Đọc dữ liệu từ các nguồn dữ liệu
    Source1 = if FileExists(Path1) then Csv.Document(File.Contents(Path1), [Delimiter=",", Columns=23, Encoding=65001, QuoteStyle=QuoteStyle.None]) else null,
    Source2 = if FileExists(Path2) then Csv.Document(File.Contents(Path2), [Delimiter=",", Columns=23, Encoding=65001, QuoteStyle=QuoteStyle.None]) else null,

    // Chọn nguồn dữ liệu hợp lệ
    WorkingData =
        if Table.RowCount(Source1) > 0 then
            Source1
        else if Table.RowCount(Source2) > 0 then
            Source2
        else
            #table({"Error"}, {{"Không tìm thấy dữ liệu hợp lệ"}})
in
    WorkingData
 
Lần chỉnh sửa cuối:
Bạn thử cái vậy xem được không?
List.Select(List.Transform({"W:\01_Mold\Ngày 1.csv","W:\01_Mold\Ngày 1.csv"}, each try Csv.Document(File.Contents(_), [Delimiter=",", Columns=23, Encoding=65001, QuoteStyle=QuoteStyle.None]) otherwise null), each _<>null)
 
Bạn thử cái vậy xem được không?
List.Select(List.Transform({"W:\01_Mold\Ngày 1.csv","W:\01_Mold\Ngày 1.csv"}, each try Csv.Document(File.Contents(_), [Delimiter=",", Columns=23, Encoding=65001, QuoteStyle=QuoteStyle.None]) otherwise null), each _<>null)
[/QUOTE]
Nó không có ra gì hết ạ
[ATTACH type="full"]302588[/ATTACH]
 

File đính kèm

  • 1721718165398.png
    1721718165398.png
    7 KB · Đọc: 16
Kết quả đó còn gì nữa, nó tạo ra 1 List gồm 2 table, nếu bạn thử xóa đi 1 trong 2 file cvs thì kết quả là 1 table.
 
Kết quả đó còn gì nữa, nó tạo ra 1 List gồm 2 table, nếu bạn thử xóa đi 1 trong 2 file cvs thì kết quả là 1 table.
Nhưng em chỉ muốn nó load 1 trong 2 thôi ạ, ví dụ nếu file1 tồn tại thì nó sẽ load file1, còn file1 bị xoá thì sẽ load file 2, còn cả 2 file tồn tại thì ưu tiên load file 1 thôi ạ.
Bài đã được tự động gộp:

Code viết nhầm nên 2 dòng chỉ có 1 file.
Dạ sai chỗ nào vậy ạ
 
Dạ sai chỗ nào vậy ạ
Bạn đọc cái mảng này xem 2 thành phần của mảng nó thế nào.
{"W:\01_Mold\Ngày 1.csv","W:\01_Mold\Ngày 1.csv"}
Nhưng em chỉ muốn nó load 1 trong 2 thôi ạ, ví dụ nếu file1 tồn tại thì nó sẽ load file1, còn file1 bị xoá thì sẽ load file 2, còn cả 2 file tồn tại thì ưu tiên load file 1 thôi ạ.
Tiêu đề và bài 1 của bạn nói không rõ ràng.
 
Bạn đọc cái mảng này xem 2 thành phần của mảng nó thế nào.
{"W:\01_Mold\Ngày 1.csv","W:\01_Mold\Ngày 1.csv"}

Tiêu đề và bài 1 của bạn nói không rõ ràng.
Mảng ngày là đường dẫn chứa 2 file ạ, em đã sửa lại là {"W:\01_Mold\Ngày 1.csv","W:\01_Mold\Trống.csv"}
mà nó không ra hết nội dung trong file, chỉ trả ra 2 bảng trống
 
Mảng ngày là đường dẫn chứa 2 file ạ, em đã sửa lại là {"W:\01_Mold\Ngày 1.csv","W:\01_Mold\Trống.csv"}
mà nó không ra hết nội dung trong file, chỉ trả ra 2 bảng trống
Bạn không đưa file lên thì tôi không làm được, phải làm và test chứ không viết suông.
 
Nhưng em chỉ muốn nó load 1 trong 2 thôi ạ, ví dụ nếu file1 tồn tại thì nó sẽ load file1, còn file1 bị xoá thì sẽ load file 2, còn cả 2 file tồn tại thì ưu tiên load file 1 thôi ạ.
Bài đã được tự động gộp:


Dạ sai chỗ nào vậy ạ
Nếu chỉ lấy 1 file thì thêm đoạn này {0} sau mcode trên là được. Còn không ra kết quả hoặc sai chỗ nào thì bạn gửi file lên và kết quả bạn cần.
 
Bạn đưa file mẫu thì ít nhất mỗi file có năm ba dòng dữ liệu chứ cho file chỉ có 2 dòng dữ liệu lại còn 1 đống mấy chục dòng trắng xen giữa dòng đầu và dòng cuối, nhìn phát chán. Và mỗi file phải có dữ liệu khác nhau thì mới test được đúng/ sai khi chọn file chứ?
JavaScript:
let
    Source = Folder.Files("D:\MyPham\DOWNLOAD\csv2file"),
    Filtercsv = Table.SelectRows(Source, each ([Extension]=".csv")),
    Filterfile1 = Table.SelectRows(Filtercsv, each [Name] = "Ngày 1.csv"),
    Filterfile2 = if Table.RowCount(Filterfile1) > 0 then Filterfile1 else Table.SelectRows(Filtercsv, each [Name] <> "Ngày 1.csv"),
    FFullName = "D:\MyPham\DOWNLOAD\csv2file" & "\" & Filterfile2[Name]{0},
    Source1 = Csv.Document(File.Contents(FFullName),[Delimiter=",", Columns=23, Encoding=65001, QuoteStyle=QuoteStyle.None]),
    Header = Table.PromoteHeaders(Source1)
in
    Header
 
Lần chỉnh sửa cuối:
Nếu chỉ lấy 1 file thì thêm đoạn này {0} sau mcode trên là được.
Tôi làm theo thì nếu có đủ 2 file thì ra kết quả, xóa 1 file "Ngày 1" thì bị lỗi, xóa 1 file "Trống" thì không lỗi. Có lẽ bị fix cứng chỗ {0} vì List{0} luôn luôn là phần tử 0 của mảng tên file.

1721927162541.png
 
Tôi làm theo thì nếu có đủ 2 file thì ra kết quả, xóa 1 file "Ngày 1" thì bị lỗi, xóa 1 file "Trống" thì không lỗi. Có lẽ bị fix cứng chỗ {0} vì List{0} luôn luôn là phần tử 0 của mảng tên file.

View attachment 302657
Em chỉnh lại mcode sau:
Mã:
 List.RemoveNulls(List.Transform({"D:\GPE\Ngày 1.csv","D:\GPE\Trống.csv"}, each let a = Csv.Document(File.Contents(_), [Delimiter=",", Columns=23, Encoding=65001, QuoteStyle=QuoteStyle.None]) in try if  Table.RowCount(a) is number then a else null otherwise null )){0}
1721961365658.png
 
Tôi không nghi ngờ khả năng viết code của bạn, nhưng khi gộp nhiều hàm vào 1 dòng lệnh sẽ khó kiểm soát lỗi.
Chẳng hạn như câu lệnh mới nhất của bạn nếu tách ra 3 hoặc 4 dòng, mỗi dòng chỉ 1 hoặc 2 hàm lồng nhau thì dễ biết hàm nào lỗi hoặc hàm nào không ra kết quả.
 
Tới bài mười mấy rồi chưa nhúc nhích.
Những người làm cần xét lại, một bài đơn giản như vầy tại sao cuối cùng rắc rối thế?
- Phương pháp cô lập lỗi (isolate errors)
- Giải thuật không thích hợp?
 
Tới bài mười mấy rồi chưa nhúc nhích.
Những người làm cần xét lại, một bài đơn giản như vầy tại sao cuối cùng rắc rối thế?
- Phương pháp cô lập lỗi (isolate errors)
- Giải thuật không thích hợp?
Bài 12 tôi viết thì đã xử lý xong (có file mới làm, trước đó chưa có file chỉ nói miệng, lại còn nói không rõ ràng).
Cũng vì không có file nên bài 2 code chay lại còn copy paste nên sai (mảng 2 phần tử giống nhau). Bài 10 (cũng chưa có file) fix tạm lỗi nhưng không có file để test nên bị lỗi mà không thấy. Cuối cùng ở bài 14 đã hoàn tất.
------
Mặc dù yêu cầu đơn giản nhưng trong ngôn ngữ M không có hàm kiểm tra sự tồn tại của 1 file kiểu Is Exists, cũng không có hàm bắt lỗi kiểu IsError như Excel hay ErrNumber như VBA, nên phải kiểm tra 1 cách gián tiếp qua trung gian. Đó là lấy danh sách file, filter lọc theo yêu cầu, nếu lọc xong có 1 dòng tức là có, lọc xong không có dòng nào tức là không tồn tại. Kết quả hàm lọc đó không dùng cho bước kế tiếp mà chỉ là điều kiện để đi tiếp theo nhánh này hay nhánh kia (cấu trúc if then else).
Cả bài 12 và 14 đều áp dụng cách kiểm tra gián tiếp này.
 
Lần chỉnh sửa cuối:
...
Mặc dù yêu cầu đơn giản nhưng trong ngôn ngữ M không có hàm kiểm tra sự tồn tại của 1 file kiểu Is Exists, cũng không có hàm bắt lỗi kiểu IsError như Excel hay ErrNumber như VBA, nên phải kiểm tra 1 cách gián tiếp qua trung gian. Đó là lấy danh sách file, filter lọc theo yêu cầu, nếu lọc xong có 1 dòng tức là có, lọc xong không có dòng nào tức là không tồn tại. Kết quả hàm lọc đó không dùng cho bước kế tiếp mà chỉ là điều kiện để đi tiếp theo nhánh này hay nhánh kia (cấu trúc if then else).
Cả bài 12 và 14 đều áp dụng cách kiểm tra gián tiếp này.
Bỏ code mở/đọc file vào một hàm (Function). Nếu hàm trả về không đúng ý thì thử file thứ 2.
Code thoải mái như vậy thì dễ dùng try-catch (quên catch đi nếu không dùng 365).
Chiều hướng của các ngôn ngữ lập trình cận đại là dùng try-catch cho nên M tránh cho quý vị cái thói quen hủ lậu của VBA.

Dân GPE có thói quen cho rằng viết code ngắn là xịn. Thực tế với dân chuyên lập trình thì ngược lại. Mỗi công việc nằm trong block code riêng của nó thì dễ thở, dễ vung tay múa chân.
 
Bỏ code mở/đọc file vào một hàm (Function). Nếu hàm trả về không đúng ý thì thử file thứ 2. (1)
Code thoải mái như vậy thì dễ dùng try-catch (2)
1. Tôi tra thư viện hàm M (1000 trang tiếng Anh) không có hàm nào kiểm tra việc "không đúng ý". Mở/ đọc chỉ có 1 trong 2 kết quả là lấy được dữ liệu và lỗi, khốn nỗi không có hàm nào lấy được tình trạng lỗi/ không lỗi.
2. ngôn ngữ M có try otherwise được dùng ở bài 1 và bài 14. Bài 14 cũng kiểm tra được nhưng khó thấy hơn vì lồng quá nhiều hàm vào 1 dòng lệnh. Tôi chưa thử tách ra nhiều dòng xem nó kiểm tra tuần tự thế nào.
 
Tôi chưa thử tách ra nhiều dòng xem nó kiểm tra tuần tự thế nào.
Sau khi tách ra nhiều dòng:
JavaScript:
let
    Source = List.Transform({"D:\MyPham\DOWNLOAD\csv2file\Ngày 1.csv","D:\MyPham\DOWNLOAD\csv2file\Trống.csv"}, each
    let
        a = Csv.Document(File.Contents(_), [Delimiter=",", Columns=23, Encoding=65001, QuoteStyle=QuoteStyle.None]) ,
        n = Table.RowCount(a),
        result = try if n is number then a else null otherwise null
    in result),
    Data = List.RemoveNulls(Source),
   Header = Table.PromoteHeaders(Data{0})
in
   Header
Trong đó:
- a là mở và lấy dữ liệu cả 2 file trong 1 vòng lặp List.Transform
- n là lấy số dòng dữ liệu của mỗi file, lấy được mỗi file 1 giá trị. Nếu file 1 không tồn tại thì không thể lấy số dòng, n của file đó không tính được và nhận giá trị lỗi (không biết hình dạng giá trị lỗi ra sao). Ngược lại file có tồn tại thì n nhận giá trị number.
- result là try otherwise: Tạo 1 list 2 phần tử:
Phần tử a nào có n là number thì lấy dữ liệu của a đó, ngược lại thì gán giá trị null. Otherwise không lấy được cũng null.
- Data lọc bỏ null trong list (nếu để thì khi lấy Header sẽ lỗi)
- Header: tạo header từ dòng đầu của table thứ nhất (lấy bằng phần tử thứ nhất {0})
________________________
Như vậy code này không lấy giá trị lỗi mà lấy giá trị ngược với lỗi để làm điều kiện rẽ nhánh. Hình như gọi là phản chứng.
 
Lần chỉnh sửa cuối:
Web KT

Bài viết mới nhất

Back
Top Bottom