У меня есть файл .tsv, в котором некоторые поля представляют собой диапазоны, такие как 1 - 4
. Я хочу прочитать эти поля, как они написаны текстом. Однако при открытии файла Excel автоматически преобразует эти поля диапазона в даты. Например, 1 - 4
преобразуется в 4-Jan
. Если я попытаюсь отформатировать ячейку обратно в другой тип, значение уже будет изменено, и я могу получить только бесполезное число (39816). Даже если поля диапазона заключены в двойные кавычки, все равно происходит неправильное преобразование в дату. Как избежать такого поведения?
Excel неправильно конвертирует диапазоны в даты, как этого избежать?
Ответы (5)
Я думаю, вам лучше всего использовать средство импорта в Excel, но вам, возможно, придется вручную изменить расширение файла на csv.
При импорте обязательно выберите текст для всех столбцов с этими значениями.
Мой вопрос на самом деле является дубликатом, по крайней мере:
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)
}
}
}
Напишите 01-04 вместо 1-4 в excel..
У меня была ячейка в формате «текст» в excel, заполненная химическим casn со значением «8013-07-8», которое переформатировалось в формат даты. Чтобы решить эту проблему, я присоединил одинарную кавычку к началу значения, и она правильно отобразилась при просмотре результатов. Когда вы нажимаете на ячейку, вы видите одинарную кавычку с префиксом, но, по крайней мере, я перестал видеть ее как дату.
В моем случае, когда я набрал 5-14 в своей ячейке Excel D2, это 14 мая. С помощью кого-то я смог изменить формат даты на диапазон чисел (5-14), используя следующий подход, и хотел поделиться им с вами. (Я буду использовать мой случай в качестве примера).
- Используя формат ячейки в Excel, я преобразовал формат даты в D2 (14 мая) в число сначала (в моем случае это дало мне 43599).
- затем использовал приведенную ниже формулу в Excel, чтобы преобразовать ее 5-14. = ЕСЛИ (ТОЧНО (D2, 43599), "5-14", D2).