ここから質問投稿すると、最大4000ポイント当たる!!!! >>

TextFieldParserによる固定長テキストファイルの読込で、
桁数を文字数ではなく「byte数」で指定する方法を教えてください。
(FileOpen関数などではなく、あくまでもTextFieldParserを使用するのが前提です)
以下に、文字数指定による読込のコードを記述します。
よろしくお願いします。

'VBのコード-----------------------------------------------
  Public Shared Sub Main()
    Using reader As New TextFieldParser("C:\test.txt", Encoding.GetEncoding("SHIFT_JIS"))
      reader.TextFieldType = FieldType.FixedWidth
      reader.SetFieldWidths(2, 7, 2)

      Dim currentFields() As String
      While Not reader.EndOfData
        Try
          currentFields = reader.ReadFields() ' 一行読込
          Dim currentField As String
          For Each currentField In currentFields
            Trace.WriteLine(currentField)
          Next
        Catch ex As MalformedLineException
          MessageBox.Show(ex.Message)
        End Try
      End While
    End Using
  End Sub
'VBのコード ここまで------------------------------------

<読み込む固定長ファイル>
01やまだいちろう26
02やまだじろう 23


<実行結果>
01
やまだいちろう
26
02
やまだじろう
23


>reader.SetFieldWidths(2, 7, 2)
この部分を
>reader.SetFieldBytes(2,14,2) '関数名は適当
このように指定できないか、と考えています。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

もしかすると的外れかもしれないですが……


要するに「02やまだ じろう 23」とか、半角が混じっているとおかしく
なるので全角は二バイト文字として処理したいということでしょうか?

> FileOpen関数などではなく、あくまでもTextFieldParserを使用するのが前提です

UTF-8 などの必ずしも全角文字が 2 バイトと限らない文字コードを扱う
時点で「全角は 2 バイト」というのは破綻してしまうと思います。

# たしかに Shift_JIS なので全角は 2 バイトですが……
# 文字は全角も半角も一文字と数えるという仕様なのだと思われます。

一旦、一行全て読み込み、文字列をバイト配列に変換して処理するのは
いかがでしょうか?

取り敢えず、こんな感じで貼られていたコードを部分的に変更してみま
した。

※ 見栄え上、全角文字列でインデントしてあります。
  拙いコードですのが、ご容赦下さい。

REM 動作確認した時に関数にしたのでそのままです。
Sub ReadFile()
 Using reader As New TextFieldParser("C:\test.txt", Encoding.GetEncoding("SHIFT_JIS"))
  REM reader.TextFieldType = FieldType.FixedWidth
  REM reader.SetFieldWidths(2, 7, 2)
  reader.TextFieldType = FieldType.Delimited

  Dim currentFields() As String
  While Not reader.EndOfData
   Try
    REM currentFields = reader.ReadFields() ' 一行読込
REM 読み込みと同時に関数へ渡す
    currentFields = GetFieldString(reader.ReadLine, "SHIFT_JIS", 2, 14, 2)
    Dim currentField As String
    For Each currentField In currentFields
     Trace.WriteLine(currentField)
    Next
   Catch ex As MalformedLineException
    MessageBox.Show(ex.Message)
   End Try
  End While
 End Using
End Sub

Function GetFieldString(ByRef Str As String, ByRef strEncode As String, ByVal ParamArray Prams() As Integer) As String()
 Dim iPram As Integer
 Dim iIndex As Integer = 0
 Dim iStrP As Integer = 0
 Dim strArray As String() = {""}
REM バイト配列に変換
 Dim ByteArray As Byte() = Encoding.GetEncoding(strEncode).GetBytes(Str)

 For Each iPram In Prams
REM 文字列に変換して文字列の配列に格納
  strArray(iStrP) = Encoding.GetEncoding(strEncode).GetString(ByteArray, iIndex, iPram)
  iStrP = iStrP + 1
  ReDim Preserve strArray(iStrP)
  iIndex = iIndex + iPram
 Next
REM 余分な配列を除く
 ReDim Preserve strArray(iStrP - 1)
 Return strArray
End Function
    • good
    • 0
この回答へのお礼

回答いただきありがとうございます。
やはりTextFieldParser自体には、SHIFT_JISでの全角を2byteで扱えるような機能はないという事のようですね。
固定長やCSVを読み込むことに特化したクラスなのでもしや、
と思ったのですが…

しかし、x415f484fさんに提示していただいたコードは代替案として
たいへん参考になります。
TextFieldParserにこだわらず、一行丸々読み込んでから
バイト配列に入れてしまえばよかったんですね。
VBFixedStringとFileOpenを使う方法などを模索していましたが、
こちらのほうがしっくりきそうです。
ありがとうございました。

お礼日時:2008/03/11 10:18

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q【VB.Net】バイト型配列に読み込んで改行区切り

教えて下さい。
ファイルをバイト型配列に読み込んで、ある固定長に区切(改行)って出力したいです。
以下簡単にサンプルとして作っているのが以下です。


【読み込みファイル.txt】
----------------------------------------------------------------------------------
AB
----------------------------------------------------------------------------------

このテキストファイルの内容(byte型では、"41 42")を1バイトづつに改行で区切りたいです。


【VB.Net】
----------------------------------------------------------------------------------
Dim BUFSIZE As Integer = 1 ' 1バイトづつ処理
Dim buf(BUFSIZE) As Byte ' 読み込み用バッファ
Dim readSize As Integer ' Readメソッドで読み込んだバイト数
Dim srcName As String = "C:\Temp\読み込みファイル.txt" ' 読み込みファイル名
Dim dstName As String = "C:\Temp\書き込みファイル.txt" ' 書き込みファイル名

Using src As New FileStream(srcName, FileMode.Open, FileAccess.Read)
Using dest As New FileStream(dstName, FileMode.Create, FileAccess.Write)
While True

' 1バイト読み込み
readSize = src.Read(buf, 0, BUFSIZE)

' 読み込むものが無ければ終了
If readSize = 0 Then Exit While

' 改行いれたい部分(動かないけど、、、)
buf = (0D,0A)

' 書き込み
dest.Write(buf, 0, BUFSIZE)

End While

End Using
End Using
----------------------------------------------------------------------------------

↓ 理想の処理後

【書き込みファイル.txt】
----------------------------------------------------------------------------------
A
B
----------------------------------------------------------------------------------

重要なのはバイト型で処理を行いたいです。(文字列ではない)
すいませんがよろしくお願いします。

教えて下さい。
ファイルをバイト型配列に読み込んで、ある固定長に区切(改行)って出力したいです。
以下簡単にサンプルとして作っているのが以下です。


【読み込みファイル.txt】
----------------------------------------------------------------------------------
AB
----------------------------------------------------------------------------------

このテキストファイルの内容(byte型では、"41 42")を1バイトづつに改行で区切りたいです。


【VB.Net】
------------------------------------...続きを読む

Aベストアンサー

While True

' 1バイト読み込み
readSize = src.Read(buf, 0, BUFSIZE)

' 読み込むものが無ければ終了
If readSize = 0 Then Exit While

' 書き込み
dest.Write(buf, 0, BUFSIZE)

' 改行コード書き込み
dest.Write(new Byte(){&H0D, &H0A}, 0, 2)

End While

QVBの「As String * 128」とは?

VBの「As String * 128」とは?

Visual Basic 2010 Expressでコンソールアプリケーションを作成しています。

OSのヴァージョンを取得する機能を作成したかったので、

http://hanatyan.sakura.ne.jp/vbhlp/Version.htm

を参考にして、OSVERSIONINFOの構造体を定義しました。

しかし
szCSDVersion As String * 128

「* 128」
の部分で、ステートメントの終わりを指定してくださいとエラーが出ます。

「* 128」とは、いったいどういう意味ですか?

また、エラーを無くす方法はありますか?

いろいろ検索しましたが、調べ方が悪いのか、分かりませんでした。

よろしくお願いします。

Aベストアンサー

参考にされたサイトはVB6.0用のソースですね。
VB6.0とVB2010(=VB.NET)は色々な部分が変わってますので、VB.NET用のサンプルを見た方が良いと思います。

http://dobon.net/vb/dotnet/system/osversion.html

ちなみに一応、質問に答えると…

> 「* 128」とは、いったいどういう意味ですか?

VB6.0(VB2010の5世代前のバージョン?)で固定長文字列を表す定義です。
* 128と記述すると128文字以上の文字列を入れても自動的に128文字でカットされます。

> また、エラーを無くす方法はありますか?

VB2010(=VB.NET)では以下のように記述します。
<VBFixedStringAttribute(128)> Private szCSDVersion As String

Q[VB.NET] テキスト出力で困ってます(T△T

すいません、教えて下さい。
Byte型で読み込んだ内容を指定した固定長で出力したいです。
例えば、次のテキストファイルがあります。

【読み込み元.txt】
-------------------------------------------------------
ABC123
-------------------------------------------------------

文字コードをSJISとしてバイナリ値では「41 42 43 31 32 33」となります。
この値を次のように出力したいです。

【出力先.txt】(3バイト区切りとする)
-------------------------------------------------------
414243
313233
-------------------------------------------------------

なんとか自力で近しい?とこまで行けたのかなと思いますが
肝心の出力がうまくいきません。

【VB.Net】
-------------------------------------------------------
Dim BUFSIZE As Integer = 2048 ' 1度に処理するサイズ
Dim buf(BUFSIZE) As Byte ' 読み込み用バッファ
Dim readSize As Integer ' Readメソッドで読み込んだバイト数
Dim srcName As String = "C:\Temp\A.txt" ' 読み込み元
Dim detName As String = "C:\Temp\B.txt" ' 出力先

' 処理開始
Using src As New FileStream(srcName, FileMode.Open, FileAccess.Read)
Using dest As New FileStream(destName, FileMode.Create, FileAccess.Write)
While True

' 読み込み
readSize = src.Read(buf, 0, BUFSIZE)

' 読み込むものが無ければ終了
If readSize = 0 Then Exit While

' 直接16進数を指定固定長で書き込みしたい部分
For i As Integer = 0 To readSize - 1
msgbox buf(i)
Next

' 書き込み実行
dest.Write(buf, 0, readSize)

End While
End Using
End Using
-------------------------------------------------------

大変お手数ですがご教示頂ければと思います。

すいません、教えて下さい。
Byte型で読み込んだ内容を指定した固定長で出力したいです。
例えば、次のテキストファイルがあります。

【読み込み元.txt】
-------------------------------------------------------
ABC123
-------------------------------------------------------

文字コードをSJISとしてバイナリ値では「41 42 43 31 32 33」となります。
この値を次のように出力したいです。

【出力先.txt】(3バイト区切りとする)
-------------------------------------------------------
414243
31323...続きを読む

Aベストアンサー

入力ファイルの各バイトを
ただ単純に16進数表記で出力するプログラムです。
適当に改造すれば目的のこともできるでしょう。

========================================
' インデントに全角空白を使っています。要削除。

Class Bin2HexText
 Shared Sub main(ByVal args As String())

  Dim srcName As String = args(0) ' 入力ファイル名
  Dim destName As String = args(1) ' 出力ファイル名

  Dim BUFSIZE As Integer = 2048 ' 1度に処理するサイズ
  Dim buf(BUFSIZE) As Byte ' 読み込み用バッファ

  Dim readSize As Integer ' Readメソッドで読み込んだバイト数

  Using src As New System.IO.FileStream( _
    srcName, System.IO.FileMode.Open, System.IO.FileAccess.Read)
   ' 出力ファイルはテキストファイルとして扱う
   Using dest As New System.IO.StreamWriter( _
     destName, False, System.Text.Encoding.GetEncoding("shift_jis"))

    While True
     readSize = src.Read(buf, 0, BUFSIZE) ' 読み込み

     If readSize = 0 Then
      Exit While ' 完了
     End If

     For i As Integer = 0 To readSize - 1
       ' Byte型数値を16進数表記(文字列)に変換して出力
       dest.Write( String.Format("{0:X2} ", buf(i)) )
     Next

    End While
   End Using
  End Using
 End Sub
End Class

入力ファイルの各バイトを
ただ単純に16進数表記で出力するプログラムです。
適当に改造すれば目的のこともできるでしょう。

========================================
' インデントに全角空白を使っています。要削除。

Class Bin2HexText
 Shared Sub main(ByVal args As String())

  Dim srcName As String = args(0) ' 入力ファイル名
  Dim destName As String = args(1) ' 出力ファイル名

  Dim BUFSIZE As Integer = 2048 ' 1度に処理するサイズ
  Dim buf(BUFSIZE) As Byte ' 読み込み用バッ...続きを読む

QDataTableから条件を満たした行を別のDatatableへコピーしたい

VC#2005とSQLServer2005ExpressEditionでWindowsアプリケーションを作成しています。

データベースの中から1つのマスタテーブルのデータを呼び出すのにTableAdapterを使ってDataTableにデータをバインドしました。
そこから条件を満たしている行をすべて抽出して同じ型のDataTableにデータをコピーしたいのです。

ですから、DataTableは2つ用意しています。1つは上記の通りデータをバインドしていますが、もう1つは宣言しただけなのでまだ空っぽの状態です。
DataTableにはカラムが3列あり、その中の1列をグループIDとしています。
条件としてはグループIDが同じであるということです。
やりたいことは条件を満たしている行をすべて抽出して空のデータテーブルにコピーすることです。

どなたかご存知の方いらっしゃれば教えてください。
よろしくお願いします。

Aベストアンサー

C#だったんですね … さほど変わりないと思いますが

お使いのコードが提示されていないのでこちらで適当な変数をでっち上げております
現在お使いのコードを支障の無い範囲で提示しましょう

//元のデータテーブルがdtSourceとすると
// テーブル構造をコピー
DataTable dt = dtSource.Clone();
DataRow r = null;
foreach( DataRow dtRow in dtSource.Select("選択するための文字列"))
{
  r = dt.NewRow();
  for( int n = 0; n < dtRow.ItemArray.Length; n++ )
  {
    r[n] = dtRow[n];
  }
  dt.Rows.Add( r );
}
といった具合になると思います

# 前回の投稿中のstSorceはdtSourceの単なるミスです

QMAX値を条件にデータを取得するには?

SQL文で困っています。
ご教授下さい。


下記のようなデータがあった場合、それぞれの区分毎に
年月が最大(最新)のデータを取得したいです。
(実際には1レコードにその他項目があり、それらも取得します。)
<検索対象データ>
区分 年月   金額
-----------------------------
A   200412  600
A   200503  560
B   200311  600
B   200508  1000
B   200504  560
C   200508  400
C   200301  1100


<取得したいデータ>

区分 年月   金額
-----------------------------
A   200503  560
B   200508  1000
C   200508  400

よろしくお願いします。

Aベストアンサー

テーブル名をXXXとすると次のようなSQLでよいと思います。(最善の方法かどうかは自信がないですが)

select B.* from (select 区分, max(年月) as 年月 from XXX group by 区分) As A
inner join XXX as B on A.区分 = B.区分 and A.年月 = B.年月
order by B.区分

Q[VB.net] StringからByte配列への変換

皆さんこんばんは。
最近VB.NET2000でVisual Basicをはじめたのですが、どうにもString型の値をByte配列へ変換するやり方が分かりません。
VB6.0だとByte配列にStringを代入するだけでいいそうなのですが、.NETで代入しようとすると『型"String"の値を"Byteの1次元配列"に変換できません』というビルドエラーが表れてしまいます。


CByte( Mid(str,i,1) )
CLng( Mid(str,i,1) )

他にも上記コードのように一つずつ変換しようと試みたのですが、String中のある文字がワイドバイトらしく、System.InvalidCastExceptionが表れてしまいます。
("『"を上下反転したような文字)


ワイドバイトのStringを1バイトずつ区切ってByte配列やLong配列へ格納する手法というものはありませんでしょうか。

よろしくお願いします。

Aベストアンサー

Option Explicit On
Option Strict On
Option Compare Binary
Option Infer Off ' VB2008以上。
Class Q3512824

Shared Sub Main()
Dim Str1 As String = "ほげふが"
Dim ByteArray1 As Byte()
'Code Page 932 = Shift_JISもどき
'Code Page 65001 = UTF-8
ByteArray1 = System.Text.Encoding.GetEncoding(65001).GetBytes(Str1)
For Each Byte1 As Byte In ByteArray1
System.Console.WriteLine(Byte1.ToString)
Next
End Sub
End Class

QVB.net Double と Decimal の違い?

VB.NETで開発しています
元々はC言語で開発してましたが、最近VB.NETをしています
で、以前誰かが作ったプログラムをデバッグしているんですが、その中に Double や Decimal が混じっています
どちらも 浮動小数点 と思うんですが 違いがいまいちわかりません
混じらせる利点ってないと思うんですが、どうなんでしょう?
有効桁数が違うとかだけだったら 簡単なんですが・・

Aベストアンサー

Doubleは俗に言う倍精度浮動小数点数と同じです。
精度重視したのか、Longより大きい値を表現できることを意識したのか、10進数型(Decimal)を使った理由(作者の意図)はこちらも良くわかりません。
Decimalを含むデータ型の説明は下記にあります。
データ型をクリックで詳細説明を参照できます。
http://msdn.microsoft.com/ja-jp/library/47zceaw7.aspx
 

Q文字列の後ろから必要分だけ削除したい。

例1 Dim str As String = "あいうえお1234"

文字列の中の1234だけ削除したい場合は、
str = str.Remove(5,4)
という風に、5文字目の後から4文字削除にすればよいのですが、

例の"あいうえお"の部分の長さが毎回処理する度に異なる場合は、
文字列の頭から何文字目という指定ができないので、”後ろから4文字を削除したい”となります。その場合は、どのようなプロパティを使えばいいのでしょうか。

.NET環境です。

Aベストアンサー

Length(str)で文字数を取得できますので、後ろから4文字目は先頭から何文字目かは計算できると思いますが、どうでしょうか?

QCloseとDisposeの違い

みなさまこんばんわです。よろしくお願い申し上げます。

VB.NET 2008でコーディングしています。
CloseとDisposeの違いについて教えていただきたいのです。

これらのメソッドは、開いたファイルを閉じるときなどにも使いますが、今回お尋ねするのは、フォームを閉じるとき、しかも、自ら呼び出すとき(Me.Close() と、Me.Dispose() )のみに限ったこととしてお話しさせていただきます。

たとえば、ShowDialog() で呼び出したフォームは、そのフォーム内でMe.Close() しても、プロセスは残り、たとえば、タイマーコントロールのイベントに記述していますと、それは実行され続けます。

これを防ぐために、Me.Dispose() を使います。すると、きれいにプロセスは終了し、イベントは発生しない模様です。

そこで、「フォームを閉じる」意味のMe.Close() をすべてMe.Dispose() に変えてしまいました。確実にプロセスを破棄出来ると思ったからです。Webで調べると、違いは「再利用できる、できないの違い」という答えがありましたが、それはきっと、ファイルやオブジェクトのことで、フォームの場合は、再びShowまたはShowDialogで表示させることは可能でしたので、特に問題は感じていませんでした。

ところが、アプリケーション設定で、「最後のフォームを閉じるとき」にアプリケーションがシャットダウンする設定になってるのに、シャットダウンしてくれないことが起こりました。調べてみると、Me.Dispose() が原因。Me.Close() に変えるとうまくいきました。

わけわからなくなってきました。。。

ちなみに、その残ったフォームは、スタートアップフォームであり、別のフォームからShowまたはShowDialogメソッドで呼び出したものではありません。

ここで4つの仮説を立ててみました。

1. ShowDialogで呼び出したフォームは、Me.Dispose()、Showで呼び出した、あるいは、スタートアップフォームは、Me.Close() すれば破棄できる

2. ShowDialogで呼び出したフォームは、Me.Dispose()、スタートアップフォームは、Me.Close()、Showで呼び出したフォームは、どちらでも、破棄できる

3. 呼び出し方ではなく、別の要因が存在する

4. 併記する必要がある場合がある

Me.Close()
Me.Dispose()

または、

Me.Dispose()
Me.Close()



どれが正しいのでしょうか?どなたがご存じの方がいらっしゃいましたら、ご教授いただけませんでしょうか? どうぞよろしくお願い申し上げます。ありがとうございました。

みなさまこんばんわです。よろしくお願い申し上げます。

VB.NET 2008でコーディングしています。
CloseとDisposeの違いについて教えていただきたいのです。

これらのメソッドは、開いたファイルを閉じるときなどにも使いますが、今回お尋ねするのは、フォームを閉じるとき、しかも、自ら呼び出すとき(Me.Close() と、Me.Dispose() )のみに限ったこととしてお話しさせていただきます。

たとえば、ShowDialog() で呼び出したフォームは、そのフォーム内でMe.Close() しても、プロセスは残り、たとえば、...続きを読む

Aベストアンサー

Me.Close()
Me.Dispose()
は根本的に違うものです。

formについて、Close()メソッドはフォームの表示を終了させるメソッドです。

ほかのクラスも同様。すべてのDispose()メソッドについて、これはインスタンスの破棄を明示的に行うものです。

>再利用できる、できないの違い

Dispose()はインスタンスが破棄されるため、再びコンストラクタを用いて、インスタンスを生成しないいけません。

一方Close()はインスタンスが残っているので、それを利用することができます。

>1. ところが、アプリケーション設定で、「最後のフォームを閉じるとき」にアプリケーションがシャットダウンする設定になってるのに、シャットダウンしてくれないことが起こりました。調べてみると、Me.Dispose() が原因。
Me.Close() に変えるとうまくいきました。

通常はどちらでもうまくいきます。

>2. ShowDialogで呼び出したフォームは、Me.Dispose()、スタートアップフォームは、Me.Close()、Showで呼び出したフォームは、どちらでも、破棄できる

ShowDialogの場合は、メソッド内部で、ハンドルが破棄されているため、Close()メソッドの際にDispose()メソッドが呼び出されます。

>3. 呼び出し方ではなく、別の要因が存在する

そう思います。

>4. 併記する必要がある場合がある

インスタンスを明示的に破棄したほうがよい場合は多く存在します。
Disposeが使えるメンバはIDisposableをインターフェースとして持っているメンバです。
これらのメンバは、外部とのやり取りを行うものが多くあります。
たとえばSQLClientに含まれるようなメンバです。

外部とのコネクションを確実に破棄を保障してほしいなどという場合がありますよね、このようなときに使用します。

Using構文を使用するのとまったく同じ理由になります。
正確にはUsing構文を使用できるメンバには条件があります、IDisposableをインターフェースとして持っているメンバに限るというものです。

ほかにもガーベージコレクタによるファイナライズを伴うかどうかという違いがあります。
Disposeの場合はファイナライズが同時に行われるため、使用していたメモリ空間を開放することができます。

上記のような理由により、
Me.Close()
Me.Dispose()
は両方書いたほうがよいと思います。

蛇足ですが、
Me.Dispose()
Me.Close()
はエラーになります。
Me.Dispose()により、Me本体(インスタンス)は削除されてしまいます。
存在しないMeに対してCloseメソッドを要求することはできないためです。

Me.Close()
Me.Dispose()
は根本的に違うものです。

formについて、Close()メソッドはフォームの表示を終了させるメソッドです。

ほかのクラスも同様。すべてのDispose()メソッドについて、これはインスタンスの破棄を明示的に行うものです。

>再利用できる、できないの違い

Dispose()はインスタンスが破棄されるため、再びコンストラクタを用いて、インスタンスを生成しないいけません。

一方Close()はインスタンスが残っているので、それを利用することができます。

>1. ところが、アプリ...続きを読む

QSQLで特定の項目の重複のみを排除した全項目を取得する方法

私は仕事上でデータベースを扱っていて、タイトルのような処理を行う必要があるのですが、いかんせん方法がわからずネット上を検索しても同様だったためここで質問させていただきます。

質問点を簡単に説明いたしますと、
たとえばAというテーブルがあって、

項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 A    い    ア    以
 A    う    ア    宇
 B    え    イ    江
 B    お    イ    尾

上のような構造になっている場合に「項目名1」について重複している項目を排除し、結果として


項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 B    え    イ    江

上のようなデータを取得したいのです。
この時に、Aの重複を排除して取得するレコードは1~3行目のどれでもよいです。
また、データを取得する際には必ずそのレコードの「全項目」を取得したいのでDistinctはうまく使えませんでした。

どなたか詳しい方、方法を教えてくださると幸いです。回答お待ちしております。

私は仕事上でデータベースを扱っていて、タイトルのような処理を行う必要があるのですが、いかんせん方法がわからずネット上を検索しても同様だったためここで質問させていただきます。

質問点を簡単に説明いたしますと、
たとえばAというテーブルがあって、

項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 A    い    ア    以
 A    う    ア    宇
 B    え    イ    江
 B    お    イ    尾

上のよ...続きを読む

Aベストアンサー

比較可能で一意性のある値をもてる項目6をテーブルに追加して、

select T.* from T, (select Item1,min(Item6) as Item6 from T group by item1) W where T.item6=W.item6;

――ってやるのが、一番手っ取り早いと思います。
他のところに影響がでないのであればですが。
oracleならrowidを使うとか、レコードの更新時刻を突っ込むとか。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング