static void AnalyzeYear ( int year ) { string expression = string.Format("RD={0}$", year.ToInvariantString()); int[] found = connection.Search(expression); List <MarcRecord> records = new BatchRecordReader ( connection, connection.Database, 500, true, found ) .ReadAll(true); foreach (MarcRecord record in records) { ReaderInfo reader = ReaderInfo.Parse(record); DateTime registrationDate = reader.RegistrationDate; DateTime lastVisitDate = reader.LastVisitDate; if (lastVisitDate == DateTime.MinValue) { lastVisitDate = reader.LastRegistrationDate; } if (lastVisitDate == DateTime.MinValue) { if (!ReferenceEquals(reader.Enrollment, null) && reader.Enrollment.Length != 0) { lastVisitDate = reader.Enrollment.Max(e => e.Date); } } if (lastVisitDate == DateTime.MinValue) { lastVisitDate = registrationDate; } int visitDays = (int)(lastVisitDate - registrationDate).TotalDays; if (visitDays == 0) { visitDays = 1; } int visits = reader.Visits.Length; double rate = (double)visits / visitDays; Console.WriteLine ( "{0}\t{1}\t{2}\t{3}\t{4}\t{5:F3}", reader.Ticket, registrationDate.ToShortDateString(), visitDays, reader.LastVisitDate.ToShortDateString(), visits, rate ); } }
private static void ProcessOneDatabase ( [NotNull] string inputFileName ) { using (DirectAccess64 accessor = new DirectAccess64(inputFileName, DirectAccessMode.ReadOnly)) { int maxMfn = accessor.GetMaxMfn(); Console.WriteLine("{0}: Max MFN={1}", inputFileName, maxMfn); for (int mfn = 1; mfn < maxMfn; mfn++) { if (mfn % 100 == 1) { Console.Write(" {0} ", mfn - 1); } try { MarcRecord record = accessor.ReadRecord(mfn); if (!ReferenceEquals(record, null)) { ReaderInfo readerInfo = ReaderInfo.Parse(record); string ticket = readerInfo.Ticket; if (string.IsNullOrEmpty(ticket)) { continue; } DepersonalizedReader depersonalized; if (readers.TryGetValue(ticket, out depersonalized)) { depersonalized.AddVisits(readerInfo.Visits); } else { depersonalized = DepersonalizedReader .FromReaderInfo(readerInfo); readers.Add(ticket, depersonalized); } } } catch (Exception exception) { Console.WriteLine(); Console.WriteLine("MFN {0}: {1}", mfn, exception.Message); } } } Console.WriteLine("Total: {0}", readers.Count); Console.WriteLine("Memory: {0}", Process.GetCurrentProcess().WorkingSet64); }
private void ParseAndAddReader ( MarcRecord record ) { ReaderInfo reader = ReaderInfo.Parse(record); string status = reader.Status; if (string.IsNullOrEmpty(status)) { reader.Status = "0"; status = "0"; } Readers.Add(reader); ReadersByStatus.Add(status, reader); }
private ReaderInfo _ParseReader ( [CanBeNull] MarcRecord record ) { if (!ReferenceEquals(record, null)) { ReaderInfo result = ReaderInfo.Parse(record); string status = result.Status; if (string.IsNullOrEmpty(status)) { result.Status = "0"; } return(result); } return(null); }
/// <summary> /// Загрузка сведений о читателе. /// </summary> /// <param name="readerID"></param> /// <returns></returns> public ReaderInfo ReadReader(string readerID) { try { Client.PushDatabase(ReaderDatabase); int[] found = Client.Search(string.Format ( "I={0}", readerID )); if (found.Length == 0) { return(null); } IrbisRecord record = Client.ReadRecord(found[0]); ReaderInfo result = ReaderInfo.Parse(record); return(result); } finally { Client.PopDatabase(); } }
static void Main() { Console.CancelKeyPress += Console_CancelKeyPress; try { using (connection = new IrbisConnection()) { connection.ParseConnectionString(ConnectionString); connection.Connect(); connection.Database = DatabaseName; Console.WriteLine("Подключились"); IEnumerable <MarcRecord> records = BatchRecordReader.WholeDatabase ( connection, DatabaseName, 500 //, rdr => //{ // Console.WriteLine // ( // "{0} из {1}", // rdr.RecordsRead, // rdr.TotalRecords // ); //} ); foreach (MarcRecord record in records) { if (Cancel) { break; } if (record.Deleted) { continue; } ReaderInfo reader = ReaderInfo.Parse(record); if (reader.WorkPlace.SafeContains("ИОГУНБ")) { continue; } int age = reader.Age; int visits = reader.Visits.Count(v => v.IsVisit); if (reader.Gender.SameString("ж")) { FemaleCount++; FemaleAge.Increment(age); FemaleVisits.Augment(age, visits); } else { MaleCount++; MaleAge.Increment(age); MaleVisits.Augment(age, visits); } } } Console.WriteLine("Отключились"); Console.WriteLine(";Муж;Жен;М пос;Ж пос"); Console.WriteLine ( "Всего;{0};{1};{2};{3}", MaleCount, FemaleCount, MaleVisits.Total, FemaleVisits.Total ); for (int age = 12; age < 100; age++) { Console.WriteLine ( "{0};{1};{2};{3};{4}", age, MaleAge.GetValue(age), FemaleAge.GetValue(age), MaleVisits.GetValue(age), FemaleVisits.GetValue(age) ); } } catch (Exception exception) { Console.WriteLine(exception); } }
static void Main() { try { Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); Threshold = new DateTime(DateTime.Today.Year, 1, 1); string thresholdString = CM.AppSettings["threshold"]; if (!string.IsNullOrEmpty(thresholdString)) { Threshold = DateTime.Parse(thresholdString); } TailDb = CM.AppSettings["tail-db"]; int total = 0; int cropped = 0; string connectionString = CM.AppSettings["connection-string"]; using (IrbisConnection connection = new IrbisConnection(connectionString)) { int[] mfns = connection.Search ( "RI=$" ); const int delta = 1000; for (int i = 0; i < mfns.Length; i += delta) { int[] sub = mfns .Skip(i) .Take(delta) .ToArray(); MarcRecord[] records = connection.ReadRecords ( connection.Database, sub ); foreach (MarcRecord record in records) { if (record.Deleted) { continue; } total++; Console.WriteLine("ELAPSED: {0}", FormatSpan(stopwatch.Elapsed)); ReaderInfo reader = ReaderInfo.Parse(record); Console.WriteLine(reader); VisitInfo[] visits = record .Fields .GetField(40) .Select(VisitInfo.Parse) .Where(loan => loan.IsVisit || loan.IsReturned) .ToArray(); VisitInfo[] old = visits .Where(visit => visit.DateGiven < Threshold) .ToArray(); Console.WriteLine("VISITS TOTAL: {0}", visits.Length); Console.WriteLine("VISITS TO DELETE: {0}", old.Length); if (old.Length != 0) { if (!string.IsNullOrEmpty(TailDb)) { connection.PushDatabase(TailDb); int[] tailMfns = new int[0]; try { tailMfns = connection.Search("\"RI={0}\"", reader.Ticket); } catch (Exception ex) { Debug.WriteLine(ex); } MarcRecord copy; if (tailMfns.Length != 0) { copy = connection.ReadRecord(tailMfns[0]); Console.WriteLine("USING OLD RECORD {0}", tailMfns[0]); } else { copy = new MarcRecord(); RecordField[] non40 = record .Fields .Where(field => field.Tag != 40) .ToArray(); copy.Fields.AddRange(non40); Console.WriteLine("COPY CREATED"); } RecordField[] old40 = old.Select(loan => loan.Field).ToArray(); copy.Fields.AddRange(old40); try { connection.WriteRecord(copy, false, true); } catch (Exception ex) { Console.WriteLine("CAN'T WRITE COPY, SKIP"); Debug.WriteLine(ex); continue; } finally { connection.PopDatabase(); } Console.WriteLine("COPY WRITTEN"); } MarcRecord r2; try { r2 = connection.ReadRecord(record.Mfn); } catch (Exception ex) { Console.WriteLine("CAN'T REREAD RECORD, SKIP"); Debug.WriteLine(ex); continue; } RecordField[] toDelete = r2 .Fields .GetField(40) .Select(VisitInfo.Parse) .Where(loan => loan.IsVisit || loan.IsReturned) .Where(visit => visit.DateGiven < Threshold) .Select(visit => visit.Field) .ToArray(); foreach (RecordField field in toDelete) { r2.Fields.Remove(field); } try { connection.WriteRecord(r2, false, true); } catch (Exception ex) { Console.WriteLine("CAN'T WRITE MODIFIED RECORD, SKIP"); Debug.WriteLine(ex); continue; } Console.WriteLine("RECORD WRITTEN"); cropped++; } Console.WriteLine(new string('=', 60)); } } } stopwatch.Stop(); Console.WriteLine("TOTAL={0}", total); Console.WriteLine("CROPPED={0}", cropped); Console.WriteLine("ELAPSED={0}", FormatSpan(stopwatch.Elapsed)); } catch (Exception exception) { Console.WriteLine(exception); } }
static void Main() { Console.WriteLine(new string('=', 80)); Console.WriteLine("Start: {0}", DateTime.Now); deadline = DateTime.Today.AddDays(-1.0); try { string baseUri = CM.AppSettings["baseUri"]; string apiID = CM.AppSettings["apiID"]; string apiKey = CM.AppSettings["apiKey"]; string connectionString = CM.AppSettings["connectionString"]; string messageText = CM.AppSettings["message"]; client = new OsmiCardsClient ( baseUri, apiID, apiKey ); Console.WriteLine("PING:"); JObject ping = client.Ping(); Console.WriteLine(ping); string[] cards = client.GetCardList(); Console.Write("CARDS: {0}", cards.Length); List <string> recipients = new List <string>(); using (connection = new IrbisConnection(connectionString)) { IEnumerable <MarcRecord> batch = BatchRecordReader.Search ( connection, "RDR", "RB=$", 1000 ); foreach (MarcRecord record in batch) { ReaderInfo reader = ReaderInfo.Parse(record); string ticket = reader.Ticket; if (!ticket.OneOf(cards)) { continue; } VisitInfo[] outdated = reader.Visits .Where(v => !v.IsVisit) .Where(v => !v.IsReturned) .Where(v => v.DateExpected < deadline) .ToArray(); if (outdated.Length != 0) { Console.WriteLine ( "[{0}] {1}: {2} book(s)", reader.Ticket, reader.FullName, outdated.Length ); recipients.Add(reader.Ticket); } } } Console.WriteLine(); Console.WriteLine("Total recipient(s): {0}", recipients.Count); if (recipients.Count != 0) { client.SendPushMessage ( recipients.ToArray(), messageText ); Console.WriteLine("Send OK"); } Console.WriteLine("Finish: {0}", DateTime.Now); Console.WriteLine(new string('=', 80)); Console.WriteLine(); } catch (Exception exception) { Console.WriteLine(exception); } }
static void Main(string[] args) { if (args.Length != 2) { Console.WriteLine("Need two arguments"); return; } string inputFileName = args[0]; string outputFileName = args[1]; try { // Сначала прочитаем уже имеющиеся записи if (File.Exists(outputFileName)) { using (StreamReader stringReader = File.OpenText(outputFileName)) { MarcRecord marcRecord; while ((marcRecord = PlainText.ReadRecord(stringReader)) != null) { ReaderInfo readerInfo = ReaderInfo.Parse(marcRecord); DepersonalizedReader depersonalized = DepersonalizedReader.FromReaderInfo(readerInfo); string ticket = depersonalized.Ticket.ThrowIfNull(); readers.Add(ticket, depersonalized); } } } // Теперь будем вычитывать данные и объединять их с уже имеющимися string ext = Path.GetExtension(inputFileName); if (ext.SameString(".mst")) { ProcessOneDatabase(inputFileName); } else { string[] inputFiles = File.ReadAllLines(inputFileName); foreach (string inputFile in inputFiles) { ProcessOneDatabase(inputFile); } } // Сохраняем результат Console.WriteLine("Writing "); using (StreamWriter writer = File.CreateText(outputFileName)) { var allReaders = readers.Values; foreach (DepersonalizedReader reader in allReaders) { MarcRecord record = reader.ToMarcRecord(); PlainText.WriteRecord(writer, record); } } Console.WriteLine("DONE"); } catch (Exception exception) { Console.WriteLine(exception); } }