lyn_s
(heesuk ko)
August 13, 2020, 1:53am
1
수행하고자 하는 동작 : B열의 데이터가 날짜형식(M/dd)인 경우 해당 행의 전체 데이터를 가져와서 다른 데이터테이블(master file)의 마지막행에 붙여넣기
엑셀파일이 리스트처럼 일정한 양식으로 되어 있는 것이 아닌 보고서 양식처럼 되어 있어서 B열의 데이터 값이 날짜형식인 부분을 찾아서 가져와야 하는 상황입니다.
(다른 부분에는 빈 텍스트이거나 ‘1.목적’ 같은 text 데이터가 들어있습니다.
질문1. read한 엑셀에서 B열의 데이터가 날짜 type(M/dd) 인지를 확인할 수 있는 방법이 있을까요?
질문2.특정열 값이 제가 원하는 조건에 맞는 경우 해당 행의 전체 데이터를 가져올 수 있는 방법?
- 다른 Data Table에 붙여넣을 예정입니다.
시도해본 방법
: add data row의 DataRow부분에 ‘dt.rows(2)’ 이런식으로 해보니… 이미 다른 data table에 속해있다고 뜨네요…
lyn_s
(heesuk ko)
August 19, 2020, 1:25am
3
datetime. TryParse, TryParseExact 사용 예시 하나만 알려주실 수 있을까요…
안에 어떤 인자들이 들어가야 하는건지 모르겠어요…
찾다보니
TryParseExact(ReadOnlySpan, String , IFormatProvider, DateTimeStyles, DateTime) 이런게 나오긴 하는데 뭔지 잘 모르겠습니다.
park363
(UncleDev)
August 19, 2020, 2:29am
4
TryParse 샘플(C# 코드)
string d = “08/22”;
DateTime o;
Boolean b = DateTime.TryParse(d,out o);
Console.WriteLine(“TryParse Result {0} : {1}”,b,o);
=> TryParse Result True : 2020-08-22 오전 12:00:00
DataTable의 Select Method를 사용하면 원하는 조건의 값을 가져 올수 있고 여기서 Select 는 DataTable Column에 적용되는 Expression 속성과 같은 형식으로 제약사항이 조금있습니다.
Linq 의 Where 를 사용하면 좀더 다양한 조건으로 필터 할 수 있습니다.
아래 참고 하세요.
생성된 DataTable에서 기존 컬럼들을 계산/가공 하거나 if등 값을 비교하여 새로운 값을 생성하여 새로운 컬럼을 추가 할 경우 DataRow의 Expression 을 이용해보세요.
Expression을 사용하면 for loop을 사용하여 신규 컬럼을 처리하는 것 보다 훨씬 편리하게 처리 할 수 있습니다.
그리고 DefaultView ToTable 함수를 이용하면 DataTable의 특정 컬럼에 대한 Distinct DataTable을 추출 할 수 있고 DefaultView의 Sort 값을 검색을 위한 컬럼으로 지정하면 Find 함수를 이용하여 지정한 컬럼을 기준으로 검색도 할 수 있습니다.
샘플 파일 링크 첨부합니다.
Expression&Distinct
DataTable 데이터를 처리하는 경우가 많은데 기본 액티비티를 이용하여 처리하기 힘든 경우 Linq를 이용해 보세요.
두가지 방법이 있습니다.
첫번째
(From row in datatable.select
Where ~
Select row).CopyToTable
두번째
datatable.AsEnumerable().Where(Function ~).CopyToTable
OrderBy와 같이 이용하면 정렬도 가능합니다.
그외 Linq 기능들을 사용할 수 있습니다.
사용하려면 아래 링크 이미지 처럼 DataSetExtensions를 AssemblyReference에 추가해주어야 합니다.
[DataSetExtensions]
샘플파일 받아서 테스트 해보세요.
[Linq for datatable]
1 Like
park363
(UncleDev)
August 19, 2020, 3:56am
5
Linq Where 샘플입니다. Regex를 이용해서 조건 처리하는 것도 괜찮을 것 같네요.
참고하세요.
DataTable dt1 = new DataTable(“table”);
dt1.Columns.Add(“row”, typeof(string));
dt1.Rows.Add(new {“12/03”});
dt1.Rows.Add(new {“1203”});
dt1.Rows.Add(new {“12-03”});
dt1.Rows.Add(new {“4/3”});
DataTable dt2 = dt1.Select().Where(r => Regex.Matches(r[0].ToString(),@“([0-1]?[1-9])/([0-1]?[1-9])”).Count>0).CopyToDataTable();
dt2에는 12/03, 4/3 만 들어가게 됩니다.
park363
(UncleDev)
August 24, 2020, 8:26am
6
특정 타입만 읽어오는 것은 아래와 같은 방법이 가장 좋네요
Where에서 특정 Row의 Type을 읽어와 비교 하면 해당 타입만 가져올수 있습니다.
DataTable dt1 = new DataTable(“table1”);
dt1.Columns.Add(“data”,typeof(object));
dt1.Rows.Add(new {“a”});
dt1.Rows.Add(new {1});
DataTable dt2 = dt1.Select().Where(r => r[0].GetType() == typeof(string)).CopyToDataTable();