• 2024/05/04

Import data from a column of DataTable to List of string

UiPath를 통해 RPA 프로세스를 작성하면서,
가장 자주 다루게 되는 데이터 유형 중에 하나는 데이터 테이블이다.

데이터 테이블에서 원하는 데이터를 얻기 위해 작업을 진행하다 보면,
간혹 ‘한 열의 데이터를 추출’해야 하는 경우가 종종 있었다.

이 포스팅에서는 주어진 데이터 테이블에서
한 열의 데이터 전체를 리스트 변수로 가져오는 방법에 대한
두 가지 방법을 소개하며, 각각의 처리 속도까지 비교해보고자 한다.

실습을 위한 준비

이 포스팅에서는 데이터 테이블로서 활용하기 위해
공공 데이터 포털에서 ‘건강보험심사평가원_전국 병의원 및 약국 현황’ 데이터 중
‘병원정보서비스.csv’파일을 xlsx 파일로 저장하여 사용했다.

공공 데이터 포털

해당 데이터에는 총 74,756개의 병원 데이터가 포함되어 있는데,
데이터의 양이 생각보다 많은 관계로 10,000개의 데이터를 제외하고 모두 삭제해서 사용했다.
그 이외의 데이터에 대해서는 별도의 처리는 없이 파일 포맷만 csv에서 xlsx로 변경하여 저장했다.

병원정보서비스.xlsx 파일

그리고 엑셀 파일을 읽어와서 데이터테이블 변수로 저장하는 작업을 미리 만들어 두었다.

Excel Application Scope

마지막으로 이 실습에 필요한 리스트 변수 및 데이터 테이블 변수를 초기화 해두었다.

데이터테이블 변수와 리스트 변수 초기화

UiPath 액티비티로만 처리해보기

내가 생각하는 UiPath 장점 중에 하나는 누구나 쉽게 목표를 달성할 수 있다는 점이다.

액티비티만으로 구성할 때는 ‘For Each Row in Data Table’ 액티비티를 배치하고,
그 안에 Add To Collection을 각 행마다 반복적으로 수행하도록 하면
List 변수에 데이터를 쉽게 추가할 수 있다.

이 방법은 매우 간단하게 구현할 수 있으며, 별도의 함수가 필요하지 않다는 점에서
직관적인 방법이기도 하다.

For Each Row in Data Table로 구현

LINQ를 통해 처리해보기

지금 소개하는 방식은 LINQ(Language Integrated Query, 통합 언어 쿼리)로 구현한 방법으로
앞서 액티비티만으로 구현한 방식과는 다르게 조금 더 깊게 들어간 방식이다.

액티비티만으로 구성한 것과는 달리 Assign 액티비티 하나로만 구현되며,
Assign의 To에는 리스트 변수를, Value에는 LINQ 질의식을 입력한다.

이 방식은 C#과 .NET Framework 3.5 이상을 요구하며, UiPath는 모두 만족하기 때문에 사용하기 용이하다.

눈에 직접 보이지는 않지만, 최소한의 코드로 데이터 소스(여기서는 데이터 테이블)에 대한
필터링, 정렬, 그룹화 작업을 수행할 수 있기 때문에, 개인적으로는 애용하는 편이다.

Assign
Assign의 Value(스크린샷 보다 아래 코드를 참조)
(From row_기관별_데이터 in dt_전국병원정보.AsEnumerable() Select Convert.ToString(row_기관별_데이터("요양기관명"))).ToList

처리 속도의 비교

한 Sequence 내에서 10,000개의 행을 가지는 데이터에 대해,
액티비티만을 이용해 구현한 방법과 LINQ를 이용해 구현한 방법에 대해 비교해보았다.

For Each Row in Data Table로 구현된 스크립트의 앞/뒤로
시작 시간(DateTime)과 종료 시간(DateTime)을 저장하는 Assign을 배치하고,
종료 시간을 저장하는 Assign 다음에 소요된 시간(TimeSpan)을 계산해서 저장하는 Assign을 배치한다.

For Each Row in Data Table의 앞/뒤

이는 LINQ를 통해 구현된 부분의 앞/뒤에도 똑같이 배치한다.

Assign의 앞/뒤

그리고 소요된 시간을 계산한 액티비티의 다음에는
Log Message나 Write Line 액티비티를 통해,
각 리스트 변수의 개수와 소요된 시간을 출력하도록 구성한다.

결과 출력
"데이터 처리에 걸린 시간(Linq): " + time_소요시간.ToString
"총 요양기관의 수: " + list_str_요양기관명_linq.Count.ToString

그리고 이를 실행해보면…

처리 결과

소요시간이 상당히 차이가 난다는 것을 눈으로 직접 확인할 수 있다.
심지어 현재 이 작업을 수행한 컴퓨터는 그리 낮은 사양도 아닌데 이렇게 차이가 난다.
(CPU: Ryzen 3700X 8 Core 3.6GHz / RAM: 64GiB / SSD 사용 / Windows 11 64Bit)

마치며

LINQ를 활용한다면, 결과에서 보듯이 방대한 양의 데이터를
원하는 방식으로 추출 및 가공함에 있어서 드는 시간을 비약적으로 줄일 수 있다.

UiPath의 액티비티를 통해서 RPA 환경을 쉽게 구축할 수 있다는 장점에 더해
그 액티비티를 LINQ로 대체함으로써 시간까지 절약할 수 있게 되는 것이다.

이러한 점은 장점에 장점을 더해 큰 매력으로 다가오기에
개인적으로 LINQ를 폭넓게 쓰게 되는 계기로 작용했었다.

이 다음에는 데이터 테이블을 구성하는 열의 이름만 추출하는 방법에 대해
간단하게 설명해보고자 한다.

Leave a Reply

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다