2

こんにちは、私は現在、より高速な CSV を使用して Ruby で CSV ファイルを解析しており、CSV のデータの最初の行を削除する方法を考えています (最初の行には、別のソフトウェア パッケージによって生成された時刻/日付情報が含まれています)。

私はfasterCSV.tableを使用してから行(0)を削除してからCSVドキュメントに変換してから解析しようとしました

しかし、行はまだ文書に存在していました。

他のアイデアはありますか?

fTable = FasterCSV.table("sto.csv", :headers => true)
fTable.delete(0)
4

3 に答える 3

4

3つの提案


この行を無視する FasterCSV を取得できますか?

:return_headers => true オプションを使用して、不良行をスキップできます。2行目が実際のヘッダーでない場合、これはうまく機能します。詳しくはこちら

:return_headers:

false の場合、ヘッダー行は黙って飲み込まれます。true に設定すると、同一のヘッダーとフィールドを持つ FasterCSV::Row オブジェクトでヘッダー行が返されます (フィールドがコンバーターを通過しないことを除いて)。


別のツールで線を切り取る

これには Ruby を使用する必要はありません。システム メソッドを使用して Ruby からワンライナーを呼び出すことができる、ここで提案されているソリューションの 1 つを使用してファイルを切り刻む方法はどうでしょうか。


最大の柔軟性 - FasterCSV を使用してファイルを 1 行ずつ解析する

ファイルを直接読み取り、最初の行をスキップしてから行を受け入れるか拒否することを検討しましたか? 私のコードの中心にあるのは、ファイルを一連の行として扱い、それぞれを受け入れるか拒否するこの parse メソッドです。同様のことを行うことができますが、最初の行をスキップします。

優れた点は、独自の許容可能な行を定義することで、許容可能な行を判断できることです。メソッド - 有効な CSV データのみが受け入れ可能に渡されますか? 残りは例外に応じて破棄されます。

      def parse(file)
            #
            # Parse data
            #
            row = []

            file.each_line do |line|

                the_line = line.chomp

                begin

                    row = FasterCSV.parse_line(the_line)

                    ok, message = acceptable?(row)


                    if not ok
                        reject(file.lineno, the_line, message)
                    else
                        accept(row, the_line)
                    end

                rescue FasterCSV::MalformedCSVError => e
                    reject(file.lineno, the_line, e.to_s)
                end

            end
于 2010-05-27T07:01:38.870 に答える
2

こんにちは、オーストラリア選挙管理委員会のデータを使ってそれを行っています。問題のファイルには、1 行目に日付文字列があり、2 行目にヘッダーがあります

require 'csv'
require 'open-uri'

filename = "http://results.aec.gov.au/15508/Website/Downloads/SenateGroupVotingTicketsDownload-15508.csv"
file = File.open(open(filename))
first_line = file.readline
CSV.parse(file, headers: true).each do |row|
  puts row["State"]
end

引用したファイルはまだ存在すると思いますが、問題のファイルに置き換えることができます。さらに行をスキップする必要がある場合は、その回数 file.readline を呼び出す必要があります。

于 2013-05-07T15:01:02.243 に答える
1

ドキュメントによると、fTable = FasterCSV.table("sto.csv", :return_headers => false)あなたが望むことをするべきです。ドキュメントにこの情報があることを.table意味します。:headers => true

于 2010-05-27T07:16:17.690 に答える