Excel неправильно конвертирует диапазоны в даты, как этого избежать?

У меня есть файл .tsv, в котором некоторые поля представляют собой диапазоны, такие как 1 - 4. Я хочу прочитать эти поля, как они написаны текстом. Однако при открытии файла Excel автоматически преобразует эти поля диапазона в даты. Например, 1 - 4 преобразуется в 4-Jan. Если я попытаюсь отформатировать ячейку обратно в другой тип, значение уже будет изменено, и я могу получить только бесполезное число (39816). Даже если поля диапазона заключены в двойные кавычки, все равно происходит неправильное преобразование в дату. Как избежать такого поведения?


person juanmirocks    schedule 10.04.2013    source источник
comment
Не используйте Эксель. ;) А если серьезно, то создание настоящих файлов .xls с типизированными ячейками может быть единственным способом.   -  person deceze♦    schedule 10.04.2013
comment
Я только что узнал, что мой вопрос является дубликатом: stackoverflow.com/questions/165042/ -- Это решает проблему (хотя мне приходится переписывать поля со специальными двойными кавычками. Не использование Excel может быть лучшим решением: P)   -  person juanmirocks    schedule 10.04.2013
comment
О боже, Эксель...! D: Хорошо знать это решение.   -  person deceze♦    schedule 10.04.2013
comment
На самом деле, я просто использую Excel, чтобы легко удалить некоторые столбцы. Не могли бы вы порекомендовать мне другую простую программу для чтения tsv/csv, которая могла бы это сделать?   -  person juanmirocks    schedule 10.04.2013
comment
Всякий раз, когда мне нужно иметь дело с чем-то подобным, я обычно прибегаю к Numbers, что я и делаю установить и который в основном представляет собой Excel, который не отстой ™. Хотя это не самый быстрый и простой вариант. :3   -  person deceze♦    schedule 10.04.2013
comment
Если вам нужно использовать Excel, вы можете открыть/импортировать данные с помощью метода Query Tables, который позволяет указать, что определенные столбцы (например, эти) должны интерпретироваться как тип STRING. stackoverflow.com/a/15665605/1467082   -  person David Zemens    schedule 10.04.2013


Ответы (5)


Я думаю, вам лучше всего использовать средство импорта в Excel, но вам, возможно, придется вручную изменить расширение файла на csv.

При импорте обязательно выберите текст для всех столбцов с этими значениями.

person glh    schedule 10.04.2013

Мой вопрос на самом деле является дубликатом, по крайней мере:

1) Запретить Excel автоматически преобразовывать определенные текстовые значения в даты

2) Excel: По умолчанию используется ТЕКСТ, а не ОБЩИЕ при открытии CSV-файла

Возможные решения для Excel: 1) либо записать поля со специальными двойными кавычками, например "May 16, 2011", как "=""May 16, 2011""", либо 2) импортировать файл csv/tsv с помощью мастера внешних данных, а затем выбрать вручную, какие столбцы вы хотите читать как ТЕКСТ, а не ОБЩИЕ. (который может преобразовывать поля в даты)

Что касается моего варианта использования, я использовал Excel только для удаления некоторых столбцов. Ни одно из решений не привлекало меня, потому что я не хотел бы переписывать файлы tsv со специальными кавычками, а также потому, что у меня были сотни столбцов, и я не хотел выбирать каждый вручную для чтения как ТЕКСТ.

Поэтому я написал scala-скрипт для фильтрации tsv-файлов по именам столбцов:

package com.jmcejuela.ml

import java.io.InputStream
import java.io.Writer

import scala.io.Codec
import scala.io.Source

import Table._

/**
 * Class to represent tables with a fixed size of columns. All rows have the same columns.
 */
class Table(val rows: Seq[Row]) {
  lazy val numDiffColumns = rows.foldLeft(Set[Int]())((set, row) => set + row.size)

  def toTSV(out: Writer) {
    if (rows.isEmpty) out.write(TableEmpty.toString)
    else {
      out.write(writeLineTSV(rows.head.map(_.name))) //header
      rows.foreach(r => out.write(writeLineTSV(r.map(_.value))))
      out.close
    }
  }

  /**
   * Get a Table with only the given columns.
   */
  def filterColumnsByName(columnNames: Set[String]): Table = {
    val existingNames = rows.head.map(_.name).toSet
    assert(columnNames.forall(n => existingNames.contains(n)), "You want to include column names that do not exist")
    new Table(rows.map { row => row.filter(col => columnNames.contains(col.name)) })
  }

}

object TableEmpty extends Table(Seq.empty) {
  override def toString = "Table(Empty)"
}

object Table {
  def apply(rows: Row*) = new Table(rows)

  type Row = Array[Column]

  /**
   * Column representation. Note that each column has a name and a value. Since the class Table
   * is a sequence of rows which are a size-fixed array of columns, the name field is redundant
   * for Table. However, this column representation could be used in the future to support
   * schemata-less tables.
   */
  case class Column(name: String, value: String)

  private def parseLineTSV(line: String) = line.split("\t")
  private def writeLineTSV(line: Seq[String]) = line.mkString("", "\t", "\n")

  /**
   * It is assumed that the first row gives the names to the columns
   */
  def fromTSV(in: InputStream)(implicit encoding: Codec = Codec.UTF8): Table = {
    val linesIt = Source.fromInputStream(in).getLines
    if (linesIt.isEmpty) TableEmpty
    else {
      val columnNames = parseLineTSV(linesIt.next)
      val padding = {
        //add padding of empty columns-fields to lines that do not include last fields because they are empty
        def infinite[A](x: A): Stream[A] = x #:: infinite(x)
        infinite("")
      }
      val rows = linesIt.map { line =>
        ((0 until columnNames.size).zip(parseLineTSV(line) ++: padding).map { case (index, field) => Column(columnNames(index), field) }).toArray
      }.toStream
      new Table(rows)
    }
  }
}
person juanmirocks    schedule 10.04.2013

Напишите 01-04 вместо 1-4 в excel..

person Salman    schedule 03.03.2017

У меня была ячейка в формате «текст» в excel, заполненная химическим casn со значением «8013-07-8», которое переформатировалось в формат даты. Чтобы решить эту проблему, я присоединил одинарную кавычку к началу значения, и она правильно отобразилась при просмотре результатов. Когда вы нажимаете на ячейку, вы видите одинарную кавычку с префиксом, но, по крайней мере, я перестал видеть ее как дату.

person bechstein7    schedule 27.03.2018

В моем случае, когда я набрал 5-14 в своей ячейке Excel D2, это 14 мая. С помощью кого-то я смог изменить формат даты на диапазон чисел (5-14), используя следующий подход, и хотел поделиться им с вами. (Я буду использовать мой случай в качестве примера).

  1. Используя формат ячейки в Excel, я преобразовал формат даты в D2 (14 мая) в число сначала (в моем случае это дало мне 43599).
  2. затем использовал приведенную ниже формулу в Excel, чтобы преобразовать ее 5-14. = ЕСЛИ (ТОЧНО (D2, 43599), "5-14", D2).
person Mesfin Mengesha Tsegaye    schedule 01.04.2019