엑셀 특정조건의 행 전체 데이터 가져오기 & 읽은 셀 데이터의 type 분류?

수행하고자 하는 동작 : 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에 속해있다고 뜨네요…

  1. Datetime.TryParse 혹은 TryParseExact를 이용하면 B열의 데이터가 날짜 형태로 변환되는지를 확인할 수 있습니다. 반환값이 Boolean이므로 If의 분기로 사용하면 됩니다.

  2. Row는 서로 다른 두 Datatable에 속해 있을 수 없으므로 언급하신 대로 바로 갖다 쓸수는 없습니다. DataRow 말고 ArrayRow 쪽에 dt.rows(2).ItemArray로 넣으면 값만 가져와서 Add data row가 가능합니다.

1 Like

datetime. TryParse, TryParseExact 사용 예시 하나만 알려주실 수 있을까요…
안에 어떤 인자들이 들어가야 하는건지 모르겠어요…

찾다보니
TryParseExact(ReadOnlySpan, String, IFormatProvider, DateTimeStyles, DateTime) 이런게 나오긴 하는데 뭔지 잘 모르겠습니다.

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 를 사용하면 좀더 다양한 조건으로 필터 할 수 있습니다.
아래 참고 하세요.

1 Like

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 만 들어가게 됩니다.

특정 타입만 읽어오는 것은 아래와 같은 방법이 가장 좋네요
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();