I have a datatable “DT_data” which I use excel read range to get them. Then I would use For Each Row in “DT_data” to convert each row into a string.
For the column name which is in one line its fine, I manage to read the column and retrieve the row values in string. Which looks like this in the excel cell:
I tried to copy paste the exact column name (copy from the cell) into my assign activity (with line breaks). But its not working. Still could not access the column name.
I also noticed the Column Name headers pattern are like this, many of them are in multiple lines in one cell.
How do I make sure my datatable headers are all in one line and only 1 white spaces between them? So that it would be easier for me to access the datatable for further processing.
Your help and suggestions are greatly appreciated.
Bạn có thể dùng Assign với LINQ trong UiPath để xóa các dòng trong DataTable A mà bị trùng với DataTable B.
Cách làm bằng Assign
Assign 1: Lọc DataTable A để loại bỏ các dòng trùng với B
dtA = dtA.AsEnumerable().
Where(Function(rowA) Not dtB.AsEnumerable().
Any(Function(rowB) rowA.ItemArray.SequenceEqual(rowB.ItemArray))).
CopyToDataTable()
Giải thích
dtA.AsEnumerable().Where(…) → Duyệt từng dòng trong dtA.
Not dtB.AsEnumerable().Any(…) → Kiểm tra nếu dòng đó không tồn tại trong dtB.
rowA.ItemArray.SequenceEqual(rowB.ItemArray) → So sánh tất cả các cột giữa rowA và rowB.
CopyToDataTable() → Chuyển kết quả lọc thành DataTable mới.
Ví dụ
DataTable A (10 dòng)
DataTable B (20 dòng, chứa 7 dòng trùng với A)
Kết quả mong muốn (DataTable A sau khi xóa dòng trùng)
Xử lý nếu không còn dòng nào hợp lệ
Nếu tất cả các dòng trong dtA bị xóa, CopyToDataTable() sẽ báo lỗi. Để tránh lỗi này, dùng:
dtA = If(dtA.AsEnumerable().
Where(Function(rowA) Not dtB.AsEnumerable().
Any(Function(rowB) rowA.ItemArray.SequenceEqual(rowB.ItemArray))).
Any(),
dtA.AsEnumerable().
Where(Function(rowA) Not dtB.AsEnumerable().
Any(Function(rowB) rowA.ItemArray.SequenceEqual(rowB.ItemArray))).
CopyToDataTable(),
dtA.Clone())
Nếu còn dòng hợp lệ, giữ lại kết quả.
Nếu không còn dòng nào, trả về DataTable rỗng (dtA.Clone()).
Kết luận
Cách này giúp xóa hoàn toàn các dòng trong dtA nếu chúng trùng với dtB, và không thay đổi thứ tự của các dòng còn lại. Bạn thử áp dụng trong UiPath xem nhé!
Dùng .Select(Function(x) x.ToString().Trim()) trên ItemArray của cả rowA và rowB
→ Điều này giúp loại bỏ khoảng trắng đầu và cuối trên từng giá trị trong bảng trước khi so sánh.
Cấu trúc và logic không thay đổi
→ Vẫn đảm bảo nếu tất cả các dòng bị xóa, dtA.Clone() sẽ được sử dụng để tránh lỗi.
Bạn thử áp dụng vào UiPath xem kết quả có đúng theo mong muốn chưa nhé!
Giữ lại các dòng chỉ xuất hiện đúng một lần trong toàn bộ bảng.
CopyToDataTable()
Chuyển danh sách các dòng hợp lệ thành DataTable.
Xử lý khi không còn dòng hợp lệ (If(…))
Nếu vẫn còn dòng hợp lệ, lưu vào dtA.
Nếu tất cả bị xóa, trả về dtA.Clone() để tránh lỗi.
Ví dụ kiểm thử
Dữ liệu ban đầu (dtA)
Sau khi chạy LINQ trên (dtA kết quả)
Loại bỏ toàn bộ các dòng bị trùng Giữ nguyên thứ tự của các dòng duy nhất Trim khoảng trắng để tránh lỗi dữ liệu Không bị lỗi nếu tất cả các dòng bị xóa
Bạn thử áp dụng trong UiPath xem kết quả có đúng như mong muốn không nhé!