2015-08-15 2 views
0

Я пытаюсь читать movies.txt с помощью F # CsvTypeProvider используя нижеуказанный код:F # CsvTypeProvider Не Чтение Полной Строки

type movies = CsvProvider<"../../movies.csv","/",InferRows=0,HasHeaders=false,IgnoreErrors=true,AssumeMissingValues=true,MissingValues=""> 

F # является умозаключением типа для фильмов типа как: FSharp.Data.Runtime.CsvFile<System.Tuple<string,string,string>> В связи с этим только первым считываются три значения столбца. Я понимаю, что это не единый файл CSV, т. Е. Каждая строка не имеет одинакового количества столбцов. Я хотел знать, является ли этот файл правильным кандидатом или нет для CsvProvider. Также есть ли другой провайдер типа, который может проанализировать вышеупомянутый файл?

Пример записи

Akira (1988)/Louie, Detroit/Lindsay, Michael (II)/Martin, Dan (II)/Stone, Doug (I)/Blum, Steven Jay/Woren, Dan/Forest, Michael (I)/Wurst, Brad/Akimoto, Yôsuke/Cole, George C./Katô, Masayuki (I)/Prescott, Simon/Reynolds, Mike (I)/Held, Watney/Prince, Derek Stephen/Lembaw, Mike/Ôtake, Hiroshi/Lang, Lex/Kusao, Takeshi/Arakawa, Tarô/Bosch, Johnny Yong (I)/Strong, Sam (I)/Buckley, Ivan/Taggert, Jim/Hirano, Masato/Seth, Joshua/Sholder, Adam/Inagaki, Satoru/Sasaki, Nozomu/Buchholz, Bob/Joyce, Christopher (I)/Sorich, Michael/Hustin, Matthew/Lemay, Lewis/Thornton, Kirk/Nakamura, Tatsuhiko/Staley, Steve (II)/Grant, Dougary/McConnohie, Michael/Pinkham, Guy/Kishino, Yukimasa/Ishida, Tarô/Umezu, Hideyuki/Osborne, Jonathan C./Iwata, Mitsuo/Tanaka, Kazumi/Stellrecht, Skip/Kamifuji, Kazuhiro/Spellos, Peter/Pope, Tony/Lee, Peter (I)/Winant, Bruce/Price, Jamieson/Ikemizu, Michihiro/Clarke, Cam/Oliver, Tony (I)/Rae, Ted/Futamata, Issei/Axelrod, Robert/Murray, Ethan/Gurd Jr., Stanley/Ôkura, Masaaki/Romersa, Joe/Walters, Burt/Kramer, Steve (I)/Kitamura, Kôichi/Mercer, Matthew/Bassett, William/Suzuki, Mizuho/Kelso, Lee/Nitta, Sanshirô/Knight, William (III)/Genda, Tesshô/Wimberger, Kurt P./Plantagenet, Richard/Shioya, Kôzô/Hatch, W.T./MacKenzie, Cody/Bergen, Bob/Frierson, Eddie/Itô, Fukue/Phelan, Julie (III)/Brown, Emily (I)/Lane, Marilyn/Ferhardt, Josil/Darro, Bambi/Fujii, Kayoko/Thornton, Chloe/Ôno, Yuka/Goodson, Barbara/Gee, Jessica/Taylor, Julie Anne/Ruff, Michelle/Koyama, Mami/Tissier, Barbara/Cody, Lara/Fuchizaki, Yuriko/Lee, Wendee/Toyoshima, Masami/Ja Lee, Patricia/Forstadt, Rebecca/Tarulli, Lisa/Fox, Sandy (I)/Marshall, Mona (I)/Sarducci, Tony 
Aladdin (1992)/Burton, Corey/Cummings, Jim (I)/Young, Philip/Williams, Robin (I)/Welker, Frank/Adler, Charles (I)/Gottfried, Gilbert/Kane, Brad (I)/Proctor, Phil/Gooch, Bruce/Seale, Douglas/Weinger, Scott/Angel, Jack (I)/Wahl, Chris/Houser, Jerry/Freeman, Jonathan (I)/Clarke, Philip L./Pinney, Patrick/Adler, Bruce/McGowan, Mickie/Taylor, Russi/Derryberry, Debi/Lockwood, Vera/Larkin, Linda/Lynn, Sherry (I)/Darling, Jennifer/Zielinski, Kathy/Salonga, Lea 

Записи в основном слеш (/), разделенных строку, содержащую название фильма следуют имена актера.

+0

Можете ли вы поделиться образец из входного файла ? –

+0

Спасибо. Я включил две записи из файла. –

+0

Любопытно, как вы хотите использовать этот файл после разбора, его структура - название/актер #/actor #/.... У вас нет заголовка (конечно, вы можете добавить его), поэтому вам нужно будет использовать бессмысленная колонка №? Этот файл может быть csv после добавления отсутствующих разделителей. Но будет нелегко рассматривать это как обычный txt-файл и просто читать по строкам, разделять с помощью разделителя, затем нарезать результат и обрабатывать первый элемент как заголовок, а оставшийся список - как список участников? – lad2025

ответ

2

Скорее всего, у вас есть проблема с вашим относительным путем до movies.csv. Возможно, это неверно, поэтому провайдер типа интерпретирует заданный путь как образец строки для вывода типа строки. И поскольку ваш разделитель обратная косая черта, он заканчивает вывод типа строки из ../../movies.csv, являющегося кортежем string*string*string.

Вы можете узнать, что случилось с вашим относительный путь и исправить ее, или просто использовать абсолютный путь к файлу CSV, как в приведенном ниже фрагменте кода:

[<Literal>] 
    let path = @"your absolute path to csv data file" 
    type Movies = CsvProvider<path,"/",.....> 
+0

Спасибо. С абсолютным путем код может читать всю запись. Однако файл содержит 4188 записей, но код успешно считывает только 76 записей. Если я удалю параметр IgnoreErrors = true, компиляция кода завершится с ошибкой: не удалось разобрать строку X с данной схемой. Ожидаемые 43 столбца получили 36. Похоже, что запись переменной длины не является подходящим набором данных для CsvProvider. –

+0

@PawanMishra: Это правильно, ожидаемый набор данных предполагает, что строки имеют одинаковое количество столбцов с отсутствующими значениями * явно * установленным. Для того чтобы ваши данные были загружены, строки короче, чем самые длинные, должны быть заполнены достаточным количеством разделителей полей, например '/////// ....', что является определенной головной болью. –