private static DateTime ParseDateTime(ref string strData, CsvFieldInfo cfi, DateTime dtDefault) { bool bDummy; return(ParseDateTime(ref strData, cfi, dtDefault, out bDummy)); }
private List <CsvFieldInfo> GetCsvFieldInfos() { List <CsvFieldInfo> lFields = new List <CsvFieldInfo>(); for (int i = 0; i < m_lvFields.Items.Count; ++i) { CsvFieldInfo cfi = (m_lvFields.Items[i].Tag as CsvFieldInfo); if (cfi == null) { Debug.Assert(false); continue; } lFields.Add(cfi); } return(lFields); }
private static DateTime ParseDateTime(ref string strData, CsvFieldInfo cfi, DateTime dtDefault, out bool bSuccess) { DateTime?odt = null; if (!string.IsNullOrEmpty(cfi.Format)) { const DateTimeStyles dts = (DateTimeStyles.AllowWhiteSpaces | DateTimeStyles.AssumeLocal); DateTime dtExact; if (DateTime.TryParseExact(strData, cfi.Format, null, dts, out dtExact)) { odt = TimeUtil.ToUtc(dtExact, false); } } if (!odt.HasValue) { DateTime dtStd; if (DateTime.TryParse(strData, out dtStd)) { odt = TimeUtil.ToUtc(dtStd, false); } } if (odt.HasValue) { strData = TimeUtil.ToDisplayString(odt.Value); bSuccess = true; } else { strData = string.Empty; bSuccess = false; odt = dtDefault; } return(odt.Value); }
private void PerformImport(PwGroup pgStorage, bool bCreatePreview) { List <CsvFieldInfo> lFields = GetCsvFieldInfos(); if (bCreatePreview) { int dx = m_lvImportPreview.ClientRectangle.Width; // Before clearing m_lvImportPreview.Items.Clear(); m_lvImportPreview.Columns.Clear(); foreach (CsvFieldInfo cfi in lFields) { string strCol = CsvFieldToString(cfi.Type); if (cfi.Type == CsvFieldType.CustomString) { strCol = (cfi.Name ?? string.Empty); } m_lvImportPreview.Columns.Add(strCol, dx / lFields.Count); } } CsvOptions opt = GetCsvOptions(); if (opt == null) { Debug.Assert(bCreatePreview); return; } string strData = GetDecodedText(); CsvStreamReaderEx csr = new CsvStreamReaderEx(strData, opt); Dictionary <string, PwGroup> dGroups = new Dictionary <string, PwGroup>(); dGroups[string.Empty] = pgStorage; if (bCreatePreview) { m_lvImportPreview.BeginUpdate(); } DateTime dtNow = DateTime.UtcNow; DateTime dtNoExpire = KdbTime.NeverExpireTime.ToDateTime(); bool bIgnoreFirstRow = m_cbIgnoreFirst.Checked; bool bIsFirstRow = true; bool bMergeGroups = m_cbMergeGroups.Checked; while (true) { string[] v = csr.ReadLine(); if (v == null) { break; } if (v.Length == 0) { continue; } if ((v.Length == 1) && (v[0].Length == 0)) { continue; } if (bIsFirstRow && bIgnoreFirstRow) { bIsFirstRow = false; continue; } bIsFirstRow = false; PwGroup pg = pgStorage; PwEntry pe = new PwEntry(true, true); ListViewItem lvi = null; for (int i = 0; i < Math.Min(v.Length, lFields.Count); ++i) { string strField = v[i]; CsvFieldInfo cfi = lFields[i]; if (cfi.Type == CsvFieldType.Ignore) { } else if (cfi.Type == CsvFieldType.Group) { pg = FindCreateGroup(strField, pgStorage, dGroups, cfi.Format, opt, bMergeGroups); } else if (cfi.Type == CsvFieldType.Title) { ImportUtil.AppendToField(pe, PwDefs.TitleField, strField, m_pwDatabase); } else if (cfi.Type == CsvFieldType.UserName) { ImportUtil.AppendToField(pe, PwDefs.UserNameField, strField, m_pwDatabase); } else if (cfi.Type == CsvFieldType.Password) { ImportUtil.AppendToField(pe, PwDefs.PasswordField, strField, m_pwDatabase); } else if (cfi.Type == CsvFieldType.Url) { ImportUtil.AppendToField(pe, PwDefs.UrlField, strField, m_pwDatabase); } else if (cfi.Type == CsvFieldType.Notes) { ImportUtil.AppendToField(pe, PwDefs.NotesField, strField, m_pwDatabase); } else if (cfi.Type == CsvFieldType.CustomString) { ImportUtil.AppendToField(pe, (string.IsNullOrEmpty(cfi.Name) ? PwDefs.NotesField : cfi.Name), strField, m_pwDatabase); } else if (cfi.Type == CsvFieldType.CreationTime) { pe.CreationTime = ParseDateTime(ref strField, cfi, dtNow); } // else if(cfi.Type == CsvFieldType.LastAccessTime) // pe.LastAccessTime = ParseDateTime(ref strField, cfi, dtNow); else if (cfi.Type == CsvFieldType.LastModTime) { pe.LastModificationTime = ParseDateTime(ref strField, cfi, dtNow); } else if (cfi.Type == CsvFieldType.ExpiryTime) { bool bParseSuccess; pe.ExpiryTime = ParseDateTime(ref strField, cfi, dtNow, out bParseSuccess); pe.Expires = (bParseSuccess && (pe.ExpiryTime != dtNoExpire)); } else if (cfi.Type == CsvFieldType.Tags) { StrUtil.AddTags(pe.Tags, StrUtil.StringToTags(strField)); } else { Debug.Assert(false); } if (bCreatePreview) { strField = StrUtil.MultiToSingleLine(strField); if (lvi != null) { lvi.SubItems.Add(strField); } else { lvi = m_lvImportPreview.Items.Add(strField); } } } if (bCreatePreview) { // Create remaining subitems for (int r = v.Length; r < lFields.Count; ++r) { if (lvi != null) { lvi.SubItems.Add(string.Empty); } else { lvi = m_lvImportPreview.Items.Add(string.Empty); } } } pg.AddEntry(pe, true); } if (bCreatePreview) { m_lvImportPreview.EndUpdate(); ProcessResize(); } }
private bool GuessFieldTypes() { CsvOptions opt = GetCsvOptions(); if (opt == null) { Debug.Assert(false); return(false); } string strData = GetDecodedText(); CsvStreamReaderEx csv = new CsvStreamReaderEx(strData, opt); string[] v; while (true) { v = csv.ReadLine(); if (v == null) { return(false); } if (v.Length == 0) { continue; } if ((v.Length == 1) && (v[0].Length == 0)) { continue; } break; } if (v.Length <= 3) { return(false); } CsvFieldInfo[] vFields = new CsvFieldInfo[v.Length]; int nDetermined = 0; for (int i = 0; i < v.Length; ++i) { CsvFieldInfo fi = GuessFieldType(v[i]); if (fi != null) { ++nDetermined; } else { fi = new CsvFieldInfo(CsvFieldType.Ignore, null, null); } vFields[i] = fi; } // Accept the guesses only if at least half of them are // probably correct if (nDetermined < (v.Length + 1) / 2) { return(false); } m_lvFields.Items.Clear(); foreach (CsvFieldInfo fi in vFields) { AddCsvField(fi.Type, fi.Name, fi.Format); } return(true); }
private bool GuessFieldTypes() { CsvOptions opt = GetCsvOptions(); if(opt == null) { Debug.Assert(false); return false; } string strData = GetDecodedText(); CsvStreamReaderEx csv = new CsvStreamReaderEx(strData, opt); string[] v; while(true) { v = csv.ReadLine(); if(v == null) return false; if(v.Length == 0) continue; if((v.Length == 1) && (v[0].Length == 0)) continue; break; } if(v.Length <= 3) return false; CsvFieldInfo[] vFields = new CsvFieldInfo[v.Length]; int nDetermined = 0; for(int i = 0; i < v.Length; ++i) { CsvFieldInfo fi = GuessFieldType(v[i]); if(fi != null) ++nDetermined; else fi = new CsvFieldInfo(CsvFieldType.Ignore, null, null); vFields[i] = fi; } // Accept the guesses only if at least half of them are // probably correct if(nDetermined < (v.Length + 1) / 2) return false; m_lvFields.Items.Clear(); foreach(CsvFieldInfo fi in vFields) AddCsvField(fi.Type, fi.Name, fi.Format); return true; }
private static DateTime ParseDateTime(ref string strData, CsvFieldInfo cfi, DateTime dtDefault, out bool bSuccess) { DateTime? odt = null; if(!string.IsNullOrEmpty(cfi.Format)) { const DateTimeStyles dts = (DateTimeStyles.AllowWhiteSpaces | DateTimeStyles.AssumeLocal); DateTime dtExact; if(DateTime.TryParseExact(strData, cfi.Format, null, dts, out dtExact)) odt = dtExact; } if(!odt.HasValue) { DateTime dtStd; if(DateTime.TryParse(strData, out dtStd)) odt = dtStd; } if(odt.HasValue) { strData = TimeUtil.ToDisplayString(odt.Value); bSuccess = true; } else { strData = string.Empty; bSuccess = false; odt = dtDefault; } return odt.Value; }
private static DateTime ParseDateTime(ref string strData, CsvFieldInfo cfi, DateTime dtDefault) { bool bDummy; return ParseDateTime(ref strData, cfi, dtDefault, out bDummy); }