마크작성기능 완료, fullmarc 해석기 1차완료
This commit is contained in:
@@ -1,3 +1,4 @@
|
|||||||
|
using Org.BouncyCastle.Pkcs;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
@@ -155,47 +156,75 @@ namespace UniMarc
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
public (bool success, string message) ParseFullMarc(string data)
|
||||||
public void ParseFullMarc(string data)
|
|
||||||
{
|
{
|
||||||
|
|
||||||
|
System.Text.StringBuilder AlertMessage = new StringBuilder();
|
||||||
Fields.Clear();
|
Fields.Clear();
|
||||||
if (string.IsNullOrEmpty(data) || data.Length < 24) return;
|
if (data.Length < 24) return (false, "마크데이터가 24보다 작습니다");
|
||||||
|
|
||||||
|
//리더부는 항상 24바이트이다. 0~23까지이다.
|
||||||
Leader = data.Substring(0, 24);
|
Leader = data.Substring(0, 24);
|
||||||
if (!int.TryParse(Leader.Substring(12, 5), out int baseAddress)) return;
|
if (!int.TryParse(Leader.Substring(12, 5), out int baseAddress)) return (false, string.Empty);
|
||||||
|
|
||||||
// Detection: Is the directory using Standard Byte Offsets (ANSI) or Scaled Byte Offsets (Unicode/UTF16)?
|
//data Length
|
||||||
bool isScaled = false;
|
if (int.TryParse(Leader.Substring(0, 5), out int dataLength) == false)
|
||||||
if (data.Length >= 31)
|
|
||||||
{
|
{
|
||||||
if (int.TryParse(data.Substring(27, 4), out int len008) && len008 > 75)
|
return (false, "Leader 전체 데이터 길이를 확인할 수 없습니다");
|
||||||
isScaled = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool isScaled = false;
|
||||||
|
|
||||||
|
|
||||||
int directoryLength = baseAddress - 24;
|
int directoryLength = baseAddress - 24;
|
||||||
int entryCount = directoryLength / 12;
|
int entryCount = directoryLength / 12;
|
||||||
|
var directory = data.Substring(24, directoryLength);
|
||||||
|
|
||||||
for (int i = 0; i < entryCount; i++)
|
var RealData = data.Substring(24 + directoryLength);
|
||||||
|
if (RealData.Contains((char)0x1D) == false)
|
||||||
{
|
{
|
||||||
int entryStart = 24 + (i * 12);
|
AlertMessage.AppendLine($"레코드식별기호 0x1D 가 없습니다");
|
||||||
if (entryStart + 12 > data.Length) break;
|
}
|
||||||
if (data[entryStart] == '\x1E' || data[entryStart] == '^' || data[entryStart] == FIELD_TERMINATOR) break;
|
else RealData = RealData.Trim((char)0x1D);
|
||||||
|
|
||||||
string tag = data.Substring(entryStart, 3);
|
//태그별식별기호로 분리한다.
|
||||||
if (!int.TryParse(data.Substring(entryStart + 3, 4), out int length)) continue;
|
if (RealData[RealData.Length - 1] == (char)0x1E)
|
||||||
if (!int.TryParse(data.Substring(entryStart + 7, 5), out int offset)) continue;
|
RealData = RealData.Substring(0, RealData.Length - 1);
|
||||||
|
|
||||||
// Scaling logic: directory values represent Unicode byte offsets (2x chars)
|
var Tags = RealData.Split((char)0x1E);
|
||||||
// Integer division (offset / 2) maps the byte offset to the starting char index.
|
if(Tags.Length != entryCount)
|
||||||
// Addition of 1 to length before division handles odd byte-lengths (markers).
|
{
|
||||||
int actualOffset = isScaled ? (offset / 2) : offset;
|
AlertMessage.AppendLine($"디렉토리 카운트({entryCount})와 태그수량({Tags.Length})이 일치하지 않습니다");
|
||||||
int actualLength = isScaled ? ((length + 1) / 2) : length;
|
}
|
||||||
|
|
||||||
if (baseAddress + actualOffset >= data.Length) continue;
|
for (int i = 0; i < Math.Min(entryCount,Tags.Length); i++)
|
||||||
if (baseAddress + actualOffset + actualLength > data.Length)
|
{
|
||||||
actualLength = data.Length - (baseAddress + actualOffset);
|
int entryStart = (i * 12);
|
||||||
|
|
||||||
string fieldData = data.Substring(baseAddress + actualOffset, actualLength);
|
//TAG(3)+LENGTH(4)+OFFSET(5)=12
|
||||||
|
if (entryStart + 12 > directory.Length) break;
|
||||||
|
if (directory[entryStart] == '\x1E' || directory[entryStart] == '^' || directory[entryStart] == FIELD_TERMINATOR) break;
|
||||||
|
|
||||||
|
string tag = directory.Substring(entryStart, 3);
|
||||||
|
var tag_len = directory.Substring(entryStart + 3, 4);
|
||||||
|
var tag_off = directory.Substring(entryStart + 7, 5);
|
||||||
|
|
||||||
|
if (!int.TryParse(tag_len, out int length))
|
||||||
|
{
|
||||||
|
AlertMessage.AppendLine($"태그({tag}) 길이를 확인할 수 없습니다 값:{tag_len}");
|
||||||
|
}
|
||||||
|
if (!int.TryParse(tag_off, out int offset))
|
||||||
|
{
|
||||||
|
AlertMessage.AppendLine($"태그({tag}) 오프셋을 확인할 수 없습니다 값:{offset}");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
string fieldData = Tags[i];
|
||||||
fieldData = fieldData.TrimEnd('\x1E', '\x1D', FIELD_TERMINATOR, '^', ' ');
|
fieldData = fieldData.TrimEnd('\x1E', '\x1D', FIELD_TERMINATOR, '^', ' ');
|
||||||
|
|
||||||
MarcField field = new MarcField(tag);
|
MarcField field = new MarcField(tag);
|
||||||
@@ -203,16 +232,42 @@ namespace UniMarc
|
|||||||
field.ControlValue = fieldData;
|
field.ControlValue = fieldData;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (fieldData.Length >= 2)
|
var subfieldIndex = fieldData.IndexOf((char)0x1f);
|
||||||
|
string fielddata = "";
|
||||||
|
if (subfieldIndex < 0)
|
||||||
|
{
|
||||||
|
//1f가 없는 것은 오류 처리한다.
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else if (subfieldIndex < 1)
|
||||||
|
{
|
||||||
|
//지시기호없이 데이터가 시작되는경우이다.
|
||||||
|
field.Indicators = " ";
|
||||||
|
ParseSubfields(field, fieldData);
|
||||||
|
}
|
||||||
|
else if (subfieldIndex < 2)
|
||||||
|
{
|
||||||
|
//지시기호가1개이다 뒤에 공백을 넣자
|
||||||
|
field.Indicators = fieldData.Substring(0, subfieldIndex) + " ";
|
||||||
|
ParseSubfields(field, fieldData.Substring(1));
|
||||||
|
}
|
||||||
|
else if (subfieldIndex > 2)
|
||||||
|
{
|
||||||
|
//지시기호가 2자리보다 길다? 이건 오류처리하자.
|
||||||
|
field.Indicators = " ";
|
||||||
|
ParseSubfields(field, fieldData.Substring(subfieldIndex));
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
field.Indicators = fieldData.Substring(0, 2);
|
field.Indicators = fieldData.Substring(0, 2);
|
||||||
ParseSubfields(field, fieldData.Substring(2));
|
ParseSubfields(field, fieldData.Substring(2));
|
||||||
}
|
}
|
||||||
else if (fieldData.Length > 0)
|
|
||||||
ParseSubfields(field, fieldData);
|
|
||||||
}
|
}
|
||||||
Fields.Add(field);
|
Fields.Add(field);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return (true, AlertMessage.ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<T> GetTag<T>(string path)
|
public List<T> GetTag<T>(string path)
|
||||||
|
|||||||
@@ -16,6 +16,12 @@ namespace UniMarc
|
|||||||
{
|
{
|
||||||
Application.EnableVisualStyles();
|
Application.EnableVisualStyles();
|
||||||
Application.SetCompatibleTextRenderingDefault(false);
|
Application.SetCompatibleTextRenderingDefault(false);
|
||||||
|
|
||||||
|
//var parserF = new UniMarc.MarcParser();
|
||||||
|
//var fullMarc = System.IO.File.ReadAllText(".\\Helper\\sample_fullmarc.txt");
|
||||||
|
//var rlt = parserF.ParseFullMarc(fullMarc);
|
||||||
|
//if(rlt.success==false)
|
||||||
|
|
||||||
//AR.UTIL.MsgE("unitmarc");
|
//AR.UTIL.MsgE("unitmarc");
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -2047,8 +2047,12 @@
|
|||||||
<None Include="Connected Services\BaroService_TI\UniMarc.BaroService_TI.UpdateUserPWDResponse.datasource">
|
<None Include="Connected Services\BaroService_TI\UniMarc.BaroService_TI.UpdateUserPWDResponse.datasource">
|
||||||
<DependentUpon>Reference.svcmap</DependentUpon>
|
<DependentUpon>Reference.svcmap</DependentUpon>
|
||||||
</None>
|
</None>
|
||||||
<None Include="Helper\sample_fullmarc" />
|
<Content Include="Helper\sample_fullmarc.txt">
|
||||||
<None Include="Helper\sample_richtext" />
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</Content>
|
||||||
|
<Content Include="Helper\sample_richtext.txt">
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</Content>
|
||||||
<None Include="packages.config" />
|
<None Include="packages.config" />
|
||||||
<None Include="Properties\app.manifest" />
|
<None Include="Properties\app.manifest" />
|
||||||
<None Include="Properties\Settings.settings">
|
<None Include="Properties\Settings.settings">
|
||||||
|
|||||||
@@ -55,13 +55,6 @@ namespace UniMarc
|
|||||||
this.marcEditorControl1.SetMarcString(marc);
|
this.marcEditorControl1.SetMarcString(marc);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void MarcEditorControl1_BookSaved(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
// Removed - logic moved to btn_Save_Click
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private void tb_ISBN_KeyDown(object sender, KeyEventArgs e)
|
private void tb_ISBN_KeyDown(object sender, KeyEventArgs e)
|
||||||
{
|
{
|
||||||
if (e.KeyCode != Keys.Enter)
|
if (e.KeyCode != Keys.Enter)
|
||||||
@@ -119,11 +112,6 @@ namespace UniMarc
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private void btn_close_Click(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
this.Close();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void btn_Empty_Click(object sender, EventArgs e)
|
private void btn_Empty_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
TextReset();
|
TextReset();
|
||||||
@@ -197,91 +185,82 @@ namespace UniMarc
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#region SaveSub
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 마크DB에 UPDATE해주는 함수
|
/// 마크DB에 UPDATE해주는 함수
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="Table">테이블 이름</param>
|
/// <param name="Table">테이블 이름</param>
|
||||||
/// <param name="MarcIndex">마크 인덱스 번호</param>
|
/// <param name="MarcIndex">마크 인덱스 번호</param>
|
||||||
/// <param name="oriMarc">한줄짜리 마크</param>
|
/// <param name="FullMarc">한줄짜리 마크</param>
|
||||||
/// <param name="grade">마크 등급</param>
|
/// <param name="grade">마크 등급</param>
|
||||||
/// <param name="tag056">분류기호</param>
|
/// <param name="tag056">분류기호</param>
|
||||||
/// <param name="date">저장시각 yyyy-MM-dd HH:mm:ss</param>
|
/// <param name="v_date">저장시각 yyyy-MM-dd HH:mm:ss</param>
|
||||||
void UpdateMarc(string MarcIndex, string oriMarc, string grade, string tag056, string tag008, string date)
|
void UpdateMarc(string MarcIndex, string FullMarc, string grade)
|
||||||
{
|
{
|
||||||
var etc1 = rtEtc1.Text.Trim();
|
//도서정보추출
|
||||||
var etc2 = rtEtc2.Text.Trim();
|
var v_isbn = "";
|
||||||
|
var v_price = "";
|
||||||
|
var v_author = "";
|
||||||
|
var v_title = "";
|
||||||
|
var v_publisher = "";
|
||||||
|
var v_date = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
|
||||||
|
|
||||||
if (grade.isEmpty()) grade = "2";
|
//파서를 사용해서 변경한다
|
||||||
string[] EditTable =
|
var parser = new UniMarc.MarcParser();
|
||||||
|
parser.ParseFullMarc(FullMarc);
|
||||||
|
|
||||||
|
//ISBN와 가격 (처음나오는 020태그의 값을 적용)
|
||||||
|
var tag_020 = parser.GetTag<MarcField>("020").FirstOrDefault();
|
||||||
|
if (tag_020 != null)
|
||||||
{
|
{
|
||||||
"compidx", "marc", "marc_chk","marc1", "marc_chk1", "비고1",
|
v_isbn = tag_020.GetSubfieldValue('a');
|
||||||
"비고2", "division", "008tag", "date", "user",
|
v_price = tag_020.GetSubfieldValue('c');
|
||||||
"grade"
|
|
||||||
};
|
|
||||||
string[] EditColumn =
|
|
||||||
{
|
|
||||||
PUB.user.CompanyIdx, oriMarc, "1",mOldMarc, "0", etc1,
|
|
||||||
etc2, tag056, tag008, date, PUB.user.UserName,
|
|
||||||
grade.ToString()
|
|
||||||
};
|
|
||||||
|
|
||||||
string[] SearchTable = { "idx", "compidx" };
|
|
||||||
string[] SearchColumn = { MarcIndex, PUB.user.CompanyIdx };
|
|
||||||
|
|
||||||
//int marcChk = subMarcChk(Table, MarcIndex);
|
|
||||||
//if (IsCovertDate)
|
|
||||||
// marcChk--;
|
|
||||||
|
|
||||||
//switch (marcChk)
|
|
||||||
//{
|
|
||||||
// case 0:
|
|
||||||
// EditTable[1] = "marc1";
|
|
||||||
// EditTable[2] = "marc_chk1";
|
|
||||||
// EditTable[3] = "marc_chk";
|
|
||||||
// break;
|
|
||||||
// case 1:
|
|
||||||
// EditTable[1] = "marc2";
|
|
||||||
// EditTable[2] = "marc_chk2";
|
|
||||||
// EditTable[3] = "marc_chk1";
|
|
||||||
// break;
|
|
||||||
// case 2:
|
|
||||||
// EditTable[1] = "marc";
|
|
||||||
// EditTable[2] = "marc_chk";
|
|
||||||
// EditTable[3] = "marc_chk2";
|
|
||||||
// break;
|
|
||||||
// default:
|
|
||||||
// EditTable[1] = "marc";
|
|
||||||
// EditTable[2] = "marc_chk";
|
|
||||||
// EditTable[3] = "marc_chk2";
|
|
||||||
// break;
|
|
||||||
//}
|
|
||||||
string UpCMD = db.More_Update("Marc", EditTable, EditColumn, SearchTable, SearchColumn);
|
|
||||||
PUB.log.Add("ADDMarcUPDATE", string.Format("{0}({1}) : {2}", PUB.user.UserName, PUB.user.CompanyIdx, UpCMD.Replace("\r", " ").Replace("\n", " ")));
|
|
||||||
var rlt = Helper_DB.ExcuteNonQuery(UpCMD);
|
|
||||||
if (rlt.applyCount != 1)
|
|
||||||
UTIL.MsgE(rlt.errorMessage);
|
|
||||||
else
|
|
||||||
UTIL.MsgI("변경 완료");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//저자(100 -> 110 -> 111 순으로 적용)
|
||||||
|
var tag_100 = parser.GetTag<MarcField>("100").FirstOrDefault();
|
||||||
|
var tag_110 = parser.GetTag<MarcField>("110").FirstOrDefault();
|
||||||
|
var tag_111 = parser.GetTag<MarcField>("111").FirstOrDefault();
|
||||||
|
if (tag_111 != null)
|
||||||
|
v_author = tag_111.GetSubfieldValue('a');
|
||||||
|
else if (tag_110 != null)
|
||||||
|
v_author = tag_110.GetSubfieldValue('a');
|
||||||
|
else if (tag_100 != null)
|
||||||
|
v_author = tag_100.GetSubfieldValue('a');
|
||||||
|
|
||||||
|
//서명
|
||||||
|
var tag_245 = parser.GetTag<MarcSubfield>("245a").FirstOrDefault();
|
||||||
|
v_title = tag_245?.Value ?? string.Empty;
|
||||||
|
|
||||||
/// <summary>
|
//출판사
|
||||||
/// 마크DB에 INSERT해주는 함수
|
var tag_300b = parser.GetTag<MarcSubfield>("300b").FirstOrDefault();
|
||||||
/// </summary>
|
v_publisher = tag_300b?.Value ?? string.Empty;
|
||||||
/// <param name="Table">테이블 이름</param>
|
|
||||||
/// <param name="BookData">0:ISBN 1:서명 2:저자 3:출판사 4:정가</param>
|
//056a
|
||||||
/// <param name="oriMarc">한줄짜리 마크</param>
|
var v_056 = parser.GetTag("056a").FirstOrDefault() ?? string.Empty;
|
||||||
/// <param name="grade">마크 등급</param>
|
var v_008 = parser.GetTag("008").FirstOrDefault() ?? string.Empty;
|
||||||
/// <param name="tag056">분류기호</param>
|
|
||||||
/// <param name="date">저장시각 yyyy-MM-dd HH:mm:ss</param>
|
if (v_056.isEmpty() || v_008.isEmpty())
|
||||||
void InsertMarc(string[] BookData, string oriMarc, string grade, string tag056, string tag008, string date)
|
|
||||||
{
|
{
|
||||||
if (grade.isEmpty()) grade = "2";
|
UTIL.MsgE("056a | 008 태그의 값을 확인할 수 없습니다\n1.마크데이터를 확인 해주세요\n2.개발자에 해당 내용을 문의하세요");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (v_isbn.isEmpty() || v_title.isEmpty())
|
||||||
|
{
|
||||||
|
UTIL.MsgE("ISBN과 서명을 추출하지 못했습니다\n1.마크데이터를 확인 해주세요\n2.개발자에 해당 내용을 문의하세요");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
var etc1 = rtEtc1.Text.Trim();
|
var etc1 = rtEtc1.Text.Trim();
|
||||||
var etc2 = rtEtc2.Text.Trim();
|
var etc2 = rtEtc2.Text.Trim();
|
||||||
|
|
||||||
|
if (grade.isEmpty()) grade = "2";
|
||||||
|
|
||||||
|
|
||||||
|
if (MarcIndex.isEmpty())
|
||||||
|
{
|
||||||
|
//insert
|
||||||
string[] InsertTable =
|
string[] InsertTable =
|
||||||
{
|
{
|
||||||
"ISBN", "서명", "저자", "출판사", "가격",
|
"ISBN", "서명", "저자", "출판사", "가격",
|
||||||
@@ -291,7 +270,7 @@ namespace UniMarc
|
|||||||
|
|
||||||
//데이터중복검사필요
|
//데이터중복검사필요
|
||||||
//동일 isbnd있다면 그래도 저장할건지 한번 더 물어봐야 함
|
//동일 isbnd있다면 그래도 저장할건지 한번 더 물어봐야 함
|
||||||
if (DB_Utils.ExistISBN(BookData[0]))
|
if (DB_Utils.ExistISBN(v_isbn))
|
||||||
{
|
{
|
||||||
if (UTIL.MsgQ("동일한 ISBN이 이미 존재합니다. 그래도 저장하시겠습니까?") == DialogResult.No)
|
if (UTIL.MsgQ("동일한 ISBN이 이미 존재합니다. 그래도 저장하시겠습니까?") == DialogResult.No)
|
||||||
return;
|
return;
|
||||||
@@ -299,9 +278,9 @@ namespace UniMarc
|
|||||||
|
|
||||||
string[] InsertColumn =
|
string[] InsertColumn =
|
||||||
{
|
{
|
||||||
BookData[0], BookData[1], BookData[2], BookData[3], BookData[4],
|
v_isbn, v_title, v_author, v_publisher, v_price,
|
||||||
oriMarc, etc1, etc2, grade.ToString(), "1",
|
FullMarc, etc1, etc2, grade.ToString(), "1",
|
||||||
PUB.user.UserName, tag056, tag008, date, PUB.user.CompanyIdx
|
PUB.user.UserName, v_056, v_008, v_date, PUB.user.CompanyIdx
|
||||||
};
|
};
|
||||||
|
|
||||||
string InCMD = db.DB_INSERT("Marc", InsertTable, InsertColumn);
|
string InCMD = db.DB_INSERT("Marc", InsertTable, InsertColumn);
|
||||||
@@ -316,197 +295,37 @@ namespace UniMarc
|
|||||||
UTIL.MsgI($"저장 완료\n\nIDX:{rlt.value}");
|
UTIL.MsgI($"저장 완료\n\nIDX:{rlt.value}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 마크 저장시 사용하며, 마지막 수정일과 수정자를 가져와 덮어씌울지 백업데이터를 만들지 구분
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="TimeSpanDaysValue">저장할 마크의 마지막 수정일</param>
|
|
||||||
/// <param name="user">저장할 마크의 마지막 수정자</param>
|
|
||||||
/// <returns>마지막 수정일로부터 2일이 지나지 않고, 마지막 수정자와 해당 유저가 동일 할 경우 True 반환</returns>
|
|
||||||
private bool IsCoverData(int TimeSpanDaysValue, string user)
|
|
||||||
{
|
|
||||||
if (TimeSpanDaysValue < -1)
|
|
||||||
return false;
|
|
||||||
if (user != PUB.user.UserName)
|
|
||||||
return false;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private TimeSpan CheckDate(string LastDate, string SaveDate)
|
|
||||||
{
|
|
||||||
DateTime Last = Convert.ToDateTime(LastDate);
|
|
||||||
DateTime Save = Convert.ToDateTime(SaveDate);
|
|
||||||
|
|
||||||
return Last - Save;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 관련 도서 정보를 가져옴
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="ViewMarc">뷰형태의 마크</param>
|
|
||||||
/// <returns>0:ISBN 1:서명 2:저자 3:출판사 4:정가</returns>
|
|
||||||
string[] GetBookData(string ViewMarc)
|
|
||||||
{
|
|
||||||
// ISBN, BookName, Author, BookComp, Price
|
|
||||||
string[] result = { "", "", "", "", "" };
|
|
||||||
bool IsISBN = false;
|
|
||||||
string[] TargetArr = ViewMarc.Split('\n');
|
|
||||||
foreach (string Target in TargetArr)
|
|
||||||
{
|
|
||||||
string[] tmp = Target.Replace("▲", "").Split('\t');
|
|
||||||
// 0:ISBN 4:Price
|
|
||||||
if (tmp[0] == "020" && !IsISBN)
|
|
||||||
{
|
|
||||||
IsISBN = true;
|
|
||||||
result[0] = GetMiddelString(tmp[2], "▼a", "▼");
|
|
||||||
result[4] = GetMiddelString(tmp[2], "▼c", "▼");
|
|
||||||
}
|
|
||||||
|
|
||||||
// 2:Author
|
|
||||||
if (tmp[0] == "100")
|
|
||||||
result[2] = GetMiddelString(tmp[2], "▼a", "▼");
|
|
||||||
else if (tmp[0] == "110")
|
|
||||||
result[2] = GetMiddelString(tmp[2], "▼a", "▼");
|
|
||||||
else if (tmp[0] == "111")
|
|
||||||
result[2] = GetMiddelString(tmp[2], "▼a", "▼");
|
|
||||||
|
|
||||||
// 1:BookName
|
|
||||||
if (tmp[0] == "245")
|
|
||||||
result[1] = GetMiddelString(tmp[2], "▼a", "▼");
|
|
||||||
|
|
||||||
// 3:BookComp
|
|
||||||
if (tmp[0] == "300")
|
|
||||||
result[3] = GetMiddelString(tmp[2], "▼b", "▼");
|
|
||||||
}
|
|
||||||
|
|
||||||
//파서를 사용해서 변경한다
|
|
||||||
var parser = new UniMarc.MarcParser();
|
|
||||||
parser.ParseMnemonic(ViewMarc);
|
|
||||||
|
|
||||||
//ISBN와 가격 (처음나오는 020태그의 값을 적용)
|
|
||||||
var tag_020 = parser.GetTag<MarcField>("020").FirstOrDefault();
|
|
||||||
if (tag_020 != null)
|
|
||||||
{
|
|
||||||
result[0] = tag_020.GetSubfieldValue('a');
|
|
||||||
result[4] = tag_020.GetSubfieldValue('c');
|
|
||||||
}
|
|
||||||
|
|
||||||
//저자(100 -> 110 -> 111 순으로 적용)
|
|
||||||
var tag_100 = parser.GetTag<MarcField>("100").FirstOrDefault();
|
|
||||||
var tag_110 = parser.GetTag<MarcField>("110").FirstOrDefault();
|
|
||||||
var tag_111 = parser.GetTag<MarcField>("111").FirstOrDefault();
|
|
||||||
if (tag_111 != null)
|
|
||||||
result[2] = tag_111.GetSubfieldValue('a');
|
|
||||||
else if (tag_110 != null)
|
|
||||||
result[2] = tag_110.GetSubfieldValue('a');
|
|
||||||
else if (tag_100 != null)
|
|
||||||
result[2] = tag_100.GetSubfieldValue('a');
|
|
||||||
|
|
||||||
//서명
|
|
||||||
var tag_245 = parser.GetTag<MarcSubfield>("245a").FirstOrDefault();
|
|
||||||
result[1] = tag_245?.Value ?? string.Empty;
|
|
||||||
|
|
||||||
//출판사
|
|
||||||
var tag_300b = parser.GetTag<MarcSubfield>("300b").FirstOrDefault();
|
|
||||||
result[3] = tag_300b?.Value ?? string.Empty;
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 문자와 문자사이의 값 가져오기
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="str">대상 문자열</param>
|
|
||||||
/// <param name="begin">시작 문자열</param>
|
|
||||||
/// <param name="end">마지막 문자열</param>
|
|
||||||
/// <param name="TagNum">불러올 태그 번호</param>
|
|
||||||
/// <returns>문자 사이값</returns>
|
|
||||||
public string GetMiddelString(string str, string begin, string end, string TagNum = "")
|
|
||||||
{
|
|
||||||
string result = "";
|
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(str) || str == "")
|
|
||||||
return result;
|
|
||||||
|
|
||||||
int count = 0;
|
|
||||||
bool loop = false;
|
|
||||||
|
|
||||||
for (int a = count; a < str.Length; a++)
|
|
||||||
{
|
|
||||||
count = str.IndexOf(begin);
|
|
||||||
if (count > -1)
|
|
||||||
{
|
|
||||||
str = str.Substring(count + begin.Length);
|
|
||||||
if (loop)
|
|
||||||
// 여러 태그들 구분을 지어줌.
|
|
||||||
result += "▽";
|
|
||||||
|
|
||||||
if (str.IndexOf(end) > -1)
|
|
||||||
result += str.Substring(0, str.IndexOf(end));
|
|
||||||
else
|
else
|
||||||
result += str;
|
{
|
||||||
|
//update
|
||||||
|
|
||||||
result = TrimEndGubun(result, TagNum);
|
string[] EditTable =
|
||||||
}
|
{
|
||||||
|
"compidx", "marc", "marc_chk","marc1", "marc_chk1", "비고1",
|
||||||
|
"비고2", "division", "008tag", "date", "user",
|
||||||
|
"grade"
|
||||||
|
};
|
||||||
|
string[] EditColumn =
|
||||||
|
{
|
||||||
|
PUB.user.CompanyIdx, FullMarc, "1",mOldMarc, "0", etc1,
|
||||||
|
etc2, v_056, v_008, v_date, PUB.user.UserName,
|
||||||
|
grade.ToString()
|
||||||
|
};
|
||||||
|
|
||||||
|
string[] SearchTable = { "idx", "compidx" };
|
||||||
|
string[] SearchColumn = { MarcIndex, PUB.user.CompanyIdx };
|
||||||
|
|
||||||
|
string UpCMD = db.More_Update("Marc", EditTable, EditColumn, SearchTable, SearchColumn);
|
||||||
|
PUB.log.Add("ADDMarcUPDATE", string.Format("{0}({1}) : {2}", PUB.user.UserName, PUB.user.CompanyIdx, UpCMD.Replace("\r", " ").Replace("\n", " ")));
|
||||||
|
var rlt = Helper_DB.ExcuteNonQuery(UpCMD);
|
||||||
|
if (rlt.applyCount != 1)
|
||||||
|
UTIL.MsgE(rlt.errorMessage);
|
||||||
else
|
else
|
||||||
break;
|
UTIL.MsgI("변경 완료");
|
||||||
|
|
||||||
loop = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
string TrimEndGubun(string str, string TagNum)
|
|
||||||
{
|
|
||||||
char[] gu = { '.', ',', ':', ';', '/', ' ' };
|
|
||||||
if (TagNum == "300" || TagNum == "300a")
|
|
||||||
{
|
|
||||||
str = str.Trim();
|
|
||||||
if (TagNum == "300a")
|
|
||||||
{
|
|
||||||
gu = new char[] { '.', ',', '=', ':', ';', '/', '+', ' ' };
|
|
||||||
for (int i = 0; i < gu.Length; i++)
|
|
||||||
{
|
|
||||||
str = str.TrimEnd(gu[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (str.Contains("ill."))
|
|
||||||
return str;
|
|
||||||
if (str.Contains("p."))
|
|
||||||
return str;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (TagNum == "710" || TagNum == "910")
|
|
||||||
return str;
|
|
||||||
|
|
||||||
|
|
||||||
if (TagNum == "245") gu = new char[] { '.', ':', ';', '/', ' ' };
|
|
||||||
if (TagNum == "245a") gu = new char[] { '.', ',', '=', ':', ';', '/', ' ' };
|
|
||||||
for (int i = 0; i < gu.Length; i++)
|
|
||||||
{
|
|
||||||
str = str.TrimEnd(gu[i]);
|
|
||||||
}
|
|
||||||
//foreach (char gubun in gu)
|
|
||||||
//{
|
|
||||||
// if (str.Length < 1) continue;
|
|
||||||
// if (str[str.Length - 1] == gubun)
|
|
||||||
// {
|
|
||||||
// str = str.Remove(str.Length - 1);
|
|
||||||
// str = str.Trim();
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
|
|
||||||
return str;
|
|
||||||
}
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
|
|
||||||
private void Btn_SearchKolis_Click(object sender, EventArgs e)
|
private void Btn_SearchKolis_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
AddMarc_FillBlank af = new AddMarc_FillBlank(this);
|
AddMarc_FillBlank af = new AddMarc_FillBlank(this);
|
||||||
@@ -548,7 +367,7 @@ namespace UniMarc
|
|||||||
var inputdate = tag008.Substring(0, 6);
|
var inputdate = tag008.Substring(0, 6);
|
||||||
if (inputdate == "000000")
|
if (inputdate == "000000")
|
||||||
inputdate = DateTime.Now.ToString("yyMMdd");
|
inputdate = DateTime.Now.ToString("yyMMdd");
|
||||||
else
|
else if (inputdate != DateTime.Now.ToString("yyMMdd"))
|
||||||
{
|
{
|
||||||
if (UTIL.MsgQ($"입력일자({inputdate})를 오늘로 변경할까요?") == DialogResult.Yes)
|
if (UTIL.MsgQ($"입력일자({inputdate})를 오늘로 변경할까요?") == DialogResult.Yes)
|
||||||
{
|
{
|
||||||
@@ -560,43 +379,18 @@ namespace UniMarc
|
|||||||
|
|
||||||
if (marcEditorControl1.CheckValidation() == false) return;
|
if (marcEditorControl1.CheckValidation() == false) return;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
string tag056 = marcEditorControl1.Tag056(out string with008TagOutput);// Tag056(dbMarc, _param);
|
string tag056 = marcEditorControl1.Tag056(out string with008TagOutput);// Tag056(dbMarc, _param);
|
||||||
|
|
||||||
//tag056을 호출해야 008이추가된다.그런후에 데이터를 처리해야함
|
//tag056을 호출해야 008이추가된다.그런후에 데이터를 처리해야함
|
||||||
string fullMarc = marcEditorControl1.MakeMarcString();
|
string fullMarc = marcEditorControl1.MakeMarcString();
|
||||||
var marcString = marcEditorControl1.richTextBox1.Text;
|
var marcString = marcEditorControl1.richTextBox1.Text;
|
||||||
|
|
||||||
var parser = new UniMarc.MarcParser();
|
|
||||||
parser.ParseMnemonic(marcString);
|
|
||||||
|
|
||||||
//풀마크분석은 아직 오류가 있음.
|
|
||||||
var parserF = new UniMarc.MarcParser();
|
var parserF = new UniMarc.MarcParser();
|
||||||
parserF.ParseFullMarc(fullMarc);
|
parserF.ParseFullMarc(fullMarc);
|
||||||
|
|
||||||
var v_056 = parser.GetTag("056a").FirstOrDefault() ?? string.Empty;
|
|
||||||
|
|
||||||
if (tag056.isEmpty())
|
|
||||||
{
|
|
||||||
UTIL.MsgE("056 태그값을 확인할 수 없습니다\n개발자 문의 하세요");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
string date = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
|
|
||||||
//string orimarc = st.made_Ori_marc(dbMarc).Replace(@"\", "₩");
|
|
||||||
|
|
||||||
//if (!isMustTag(orimarc))
|
|
||||||
//{
|
|
||||||
// return;
|
|
||||||
//}
|
|
||||||
//var MarcText = fullMarc;
|
|
||||||
string midx = this.lbl_Midx.Tag?.ToString() ?? string.Empty;
|
string midx = this.lbl_Midx.Tag?.ToString() ?? string.Empty;
|
||||||
string[] BookData = GetBookData(marcString);
|
if (isUpdate == false) midx = string.Empty;
|
||||||
if (string.Join("", BookData).isEmpty())
|
|
||||||
{
|
|
||||||
UTIL.MsgE("도서정보를 추출할 수 없습니다\n개발자 문의 하세요");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var v_grade = "";
|
var v_grade = "";
|
||||||
if (radA.Checked) v_grade = "0";
|
if (radA.Checked) v_grade = "0";
|
||||||
@@ -604,10 +398,8 @@ namespace UniMarc
|
|||||||
else if (radC.Checked) v_grade = "2";
|
else if (radC.Checked) v_grade = "2";
|
||||||
else if (radD.Checked) v_grade = "3";
|
else if (radD.Checked) v_grade = "3";
|
||||||
|
|
||||||
if (isUpdate)
|
//midx 값이 emptry 라면 insert , 아니라면 update
|
||||||
UpdateMarc(midx, fullMarc, v_grade, tag056, tag008, date);
|
UpdateMarc(midx, fullMarc, v_grade);
|
||||||
else
|
|
||||||
InsertMarc(BookData, fullMarc, v_grade, tag056, tag008, date);
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user