좋아요, 가능한 한 최선을 설명하려고하겠습니다. 필자는 SQL 테이블을 사용하여 고정 너비 데이터 소스 구조 (헤더, 시작 인덱스, 필드 길이 등)를 정의하는 애플리케이션을 작성했습니다. 내 응용 프로그램이 실행되면이 테이블을 쿼리하여 ColumnName = header가있는 DataColumn 개체를 사용하여 DataTable 개체 (finalDT
)를 만듭니다. 그런 다음이 테이블에 우리가 사용하는 모든 데이터 소스에있는 DataColumn 객체 집합을 추가합니다 (파생 열이라고도 함). 또한 자동 증가 정수인 기본 키 필드를 만듭니다. 원래 고정 폭 파일을 읽으려는 자신의 솔루션을 굴렸으나 이것을 FileHelper를 사용하여 변환하려고합니다. 주로 FileHelper가 구문 분석 할 수있는 다른 파일 형식 (CSV, Excel 등)에 액세스 할 수 있도록 통합하려고합니다.FileHelpers.Dynamic을 사용하여 고정 폭 파일을 읽고 SQL에 업로드
지금, 내 문제. 나는 고정 폭 데이터 소스 파일의 필드 정의를 저장하는 방법
private static FileHelperEngine GetFixedWidthFileClass(bool ignore)
{
singletonArguments sArgs = singletonArguments.sArgs;
singletonSQL sSQL = singletonSQL.sSQL;
List<string> remove = new List<string>();
FixedLengthClassBuilder flcb = new FixedLengthClassBuilder(sSQL.FixedDataDefinition.DataTableName);
flcb.IgnoreFirstLines = 1;
flcb.IgnoreLastLines = 1;
flcb.IgnoreEmptyLines = true;
foreach (var dcs in sSQL.FixedDataDefinition.Columns)
{
flcb.AddField(dcs.header, Convert.ToInt32(dcs.length), "String");
if (ignore && dcs.ignore)
{
flcb.LastField.FieldValueDiscarded = true; //If we want to ignore a column, this is how to do it. Would like to incorporate this.
flcb.LastField.Visibility = NetVisibility.Protected;
}
else
{
flcb.LastField.TrimMode = TrimMode.Both;
flcb.LastField.FieldNullValue = string.Empty;
}
}
return new FileHelperEngine(flcb.CreateRecordClass());
}
sSQL.FixedDataDefinition.Columns
은 다음과 같습니다 FileHelper.Dynamic를 사용하여, 나는 다음과 같은 방법을 사용하여 FileHelperEngine 개체를 만들 수 있었다. 그때 수행하여 DataTable의 생성 : I 위에 표시된 GetFixedWidthFileClass()
방법의 결과를 유지하는 곳
DataTable dt = engine.ReadFileAsDT(file);
file
는 고정 폭 파일의 전체 경로이다
및 engine
이다. 이제 기본 키가없고 파생 된 열이없는 DataTable이 생겼습니다. 또한 dt
의 모든 입력란은 ReadOnly = true
으로 표시됩니다. 여기가 사물이 엉망이되는 곳입니다.
dt
을 finalDT
에 입력해야하며 기본 키 정보가없는 dt
이 있어야합니다. 그런 일이 발생할 수 있다면 finalDT
을 사용하여 내 데이터를 내 SQL 테이블에 업로드 할 수 있습니다. 그럴 수 없다면 finalDT
에 기본 키가 없지만 SQL 테이블에 업로드하는 방법이 필요합니다. SqlBulkCopy
허용합니까? 다른 방법이 있습니까?
이 시점에서 필자는 FileHelper를 사용하여 고정 너비 파일을 구문 분석하고 그 결과가 내 SQL 테이블에 저장되는 한 처음부터 기꺼이 시작할 것입니다.