/// <summary> /// Refreshes the settings assuming the file has changed, checks CodePage, Delimiter, Start Row and Header /// </summary> /// <param name="file">The file.</param> /// <param name="display">The display.</param> public static void RefreshCsvFile(this ICsvFile file, IProcessDisplay display) { Contract.Requires(file != null); Contract.Requires(display != null); var root = ApplicationSetting.ToolSetting.RootFolder; file.FileName.GetAbsolutePath(root); display.SetProcess("Checking delimited file"); GuessCodePage(file); if (display.CancellationToken.IsCancellationRequested) { return; } display.SetProcess("Code Page: " + EncodingHelper.GetEncodingName(file.CurrentEncoding.CodePage, true, file.ByteOrderMark)); file.FileFormat.FieldDelimiter = GuessDelimiter(file); if (display.CancellationToken.IsCancellationRequested) { return; } display.SetProcess("Delimiter: " + file.FileFormat.FieldDelimiter); file.SkipRows = GuessStartRow(file); if (display.CancellationToken.IsCancellationRequested) { return; } if (file.SkipRows > 0) { display.SetProcess("Start Row: " + file.SkipRows.ToString(CultureInfo.InvariantCulture)); } file.HasFieldHeader = GuessHasHeader(file, display.CancellationToken); display.SetProcess("Column Header: " + file.HasFieldHeader); }
/// <summary> /// Guesses the code page ID of a file /// </summary> /// <param name="setting">The CSVFile fileSetting</param> /// <remarks> /// No Error will be thrown, the CodePage and the BOM will bet set /// </remarks> public static void GuessCodePage(ICsvFile setting) { Contract.Requires(setting != null); // Read 256 kBytes var buff = new byte[262144]; int length; using (var fileStream = ImprovedStream.OpenRead(setting)) { length = fileStream.Stream.Read(buff, 0, buff.Length); } if (length >= 2) { var byBom = EncodingHelper.GetCodePageByByteOrderMark(buff); if (byBom != 0) { setting.ByteOrderMark = true; setting.CodePageId = byBom; return; } } setting.ByteOrderMark = false; var detected = EncodingHelper.GuessCodePageNoBom(buff, length); // ASCII will be reported as UTF-8, UTF8 includes ASCII as subset if (detected == 20127) { detected = 65001; } Log.Info("Detected Code Page: " + EncodingHelper.GetEncodingName(detected, true, setting.ByteOrderMark)); setting.CodePageId = detected; }
/// <summary> /// Handles the Load event of the EditSettings control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param> private void EditSettings_Load(object sender, EventArgs e) { fileSettingBindingSource.DataSource = m_ViewSettings; fileFormatBindingSource.DataSource = m_ViewSettings.FileFormat; // Fill Drop down cboCodePage.SuspendLayout(); cboCodePage.DataSource = EncodingHelper.CommonCodePages.Select(cp => new DisplayItem <int>(cp, EncodingHelper.GetEncodingName(cp, false))).ToList(); cboRecordDelimiter.DisplayMember = nameof(DisplayItem <int> .Display); cboRecordDelimiter.ValueMember = nameof(DisplayItem <int> .ID); cboRecordDelimiter.SelectedValue = m_ViewSettings.CodePageId; cboCodePage.ResumeLayout(true); var descConv = new EnumDescriptionConverter(typeof(RecordDelimiterType)); var di = (from RecordDelimiterType item in Enum.GetValues(typeof(RecordDelimiterType)) select new DisplayItem <int>((int)item, descConv.ConvertToString(item))).ToList(); var selValue = (int)m_ViewSettings.FileFormat.NewLine; cboRecordDelimiter.SuspendLayout(); cboRecordDelimiter.DataSource = di; cboRecordDelimiter.DisplayMember = nameof(DisplayItem <int> .Display); cboRecordDelimiter.ValueMember = nameof(DisplayItem <int> .ID); cboRecordDelimiter.SelectedValue = selValue; cboRecordDelimiter.ResumeLayout(true); quotingControl.CsvFile = m_ViewSettings; }