static public IRecord CombineRecords(IRecord currentRecord, IRecord nextRecord, String idsToMerge, String fieldInsertBefore) { var existingFields = currentRecord.GetVariableFields(); var fieldsToMove = new List <IVariableField>(); // temporarily remove some existing fields foreach (var field in existingFields) { if (field.Tag.Contains(fieldInsertBefore)) { fieldsToMove.Add(field); currentRecord.RemoveVariableField(field); } } var fields = nextRecord.GetVariableFields(); foreach (var field in fields) { if (field.Tag.Contains(idsToMerge)) { currentRecord.AddVariableField(field); } } // now add back the temporarily removed fields foreach (var field in fieldsToMove) { currentRecord.AddVariableField(field); } return(currentRecord); }
public IRecord GetAsRecord(bool permissive, bool toUtf8, String combinePartials, String defaultEncoding) { var bais = new MemoryStream(rawRecordData); MarcPermissiveStreamReader reader = new MarcPermissiveStreamReader(bais, permissive, toUtf8, defaultEncoding); IRecord next = null; if (reader.MoveNext()) { next = reader.Current; } if (combinePartials != null) { while (reader.MoveNext()) { var nextNext = reader.Current; var fieldsAll = nextNext.GetVariableFields(); var fieldIter = fieldsAll.GetEnumerator(); while (fieldIter.MoveNext()) { var vf = fieldIter.Current; if (combinePartials.Contains(vf.Tag)) { next.AddVariableField(vf); } } } } return(next); }
static public IRecord CombineRecords(IRecord currentRecord, IRecord nextRecord, String idsToMerge) { var fields = nextRecord.GetVariableFields(); foreach (var field in fields) { if (field.Tag.Contains(idsToMerge)) { currentRecord.AddVariableField(field); } } return(currentRecord); }
private void ParseRecord(IRecord record, byte[] byteArray, byte[] recordBuf, int recordLength) { ILeader ldr; ldr = factory.NewLeader(); ldr.RecordLength = recordLength; int directoryLength = 0; try { ParseLeader(ldr, byteArray); directoryLength = ldr.BaseAddressOfData - (24 + 1); } catch (IOException e) { throw new MarcException("error parsing leader with data: " + byteArray.ConvertToString(), e); } catch (MarcException e) { throw new MarcException("error parsing leader with data: " + byteArray.ConvertToString(), e); } // if MARC 21 then check encoding switch (ldr.CharCodingScheme) { case ' ': if (!isOverride) { encoding = "ISO-8859-1"; } break; case 'a': if (!isOverride) { encoding = "UTF-8"; } break; } record.Leader = ldr; if ((directoryLength % 12) != 0) { throw new MarcException("invalid directory"); } using (var inputrec = new InputStream(recordBuf)) { int size = directoryLength / 12; String[] tags = new String[size]; int[] lengths = new int[size]; byte[] tag = new byte[3]; byte[] length = new byte[4]; byte[] start = new byte[5]; String tmp; try { for (int i = 0; i < size; i++) { inputrec.Read(tag); tmp = tag.ConvertToString(); tags[i] = tmp; inputrec.Read(length); tmp = length.ConvertToString(); lengths[i] = int.Parse(tmp); inputrec.Read(start); } if (inputrec.ReadByte() != Constants.FT) { throw new MarcException("expected field terminator at end of directory"); } for (int i = 0; i < size; i++) { GetFieldLength(inputrec); if (Verifier.IsControlField(tags[i])) { byteArray = new byte[lengths[i] - 1]; inputrec.Read(byteArray); if (inputrec.ReadByte() != Constants.FT) { throw new MarcException("expected field terminator at end of field"); } var field = factory.NewControlField(); field.Tag = tags[i]; field.Data = GetDataAsString(byteArray); record.AddVariableField(field); } else { byteArray = new byte[lengths[i]]; inputrec.Read(byteArray); try { record.AddVariableField(ParseDataField(tags[i], byteArray)); } catch (Exception e) { throw new MarcException( "error parsing data field for tag: " + tags[i] + " with data: " + byteArray.ConvertToString(), e); } } } if (inputrec.ReadByte() != Constants.RT) { throw new MarcException("expected record terminator"); } } catch (IOException e) { throw new MarcException("an error occured reading input", e); } } }