コード例 #1
0
        /// <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);
        }
コード例 #2
0
        /// <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;
        }
コード例 #3
0
        /// <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;
        }